Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
1

Как заставить компилятор не компилить неправильную программу?

29.12.2012, 14:56. Показов 2720. Ответов 26
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Мне не даёт покоя разговор с одним программистом, имевший место быть несколько лет назад. Тот сказал, что он так кодит, что у него неправильный код просто-напросто не компилится, а я не стал уточнять. Многое я бы отдал, чтобы вернуться к тому разговору!

Ясно дело, что даже если это и правда, то правда условная. Компилятор же не знает, что нужно человеку. Тем не мене, может есть какие-то способы ограничить поведение (предотвратить его) программы на стадии компиляции при синтаксически правильном коде? Будем здесь их обсуждать. Начнём с простого.

C++
1
2
3
4
5
6
7
8
9
10
int main () {
 int p;
 
 //есть ли способ сделать так, чтобы 
 //компилятор  ругался на присвоение
 //(ЛЮБЫМ способом) переменной p
 //определённого значения, например, 7?
 returtn 0;
 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.12.2012, 14:56
Ответы с готовыми решениями:

Компилятор в Qt Creator: как заставить скомпилироваться и запуститься программу?
Добрый день. Я сегодня изучал С++ по Лафоре (книга) и вообщем там было задание в одном из разделов,...

есть ли компилятор для андроида? на планшете хочу компилить
или процессор в планшете не поддержит мою идею?

Как компилить программу с libjpeg?
Я не понимаю, как компилить программу с libjpeg, если я использую Visual Studio. Г* командная...

Как компилить программу .exe в другое разрешение?
Компилятор для C++ или C#, для перевода .exe в .vut с работоспособностью кода при обратном...

26
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
30.12.2012, 15:55 21
Author24 — интернет-сервис помощи студентам
Объясни, как компилятор поймёт, для чего этот конструктор предназначен?
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
30.12.2012, 20:06 22
Цитата Сообщение от kravam Посмотреть сообщение
1) Смотрим перегруженный оператор = класса T
2) Определяем, что параметром к этому оператору может идти какой-нибудь класс T1
3) Пытаемся перетипизировать (T1)8, а не получается
4) Вот и ошибка компиляции. Как-то так.
что-то не пойму что вас сейчас не устраивает когда все так и есть
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
30.12.2012, 21:34  [ТС] 23
Цитата Сообщение от Jupiter Посмотреть сообщение
3) Пытаемся перетипизировать (T1)8, а не получается
эту операцию он пытается сделать для всех чисел как я понимаю. А должно быть, чтобы (T1)8 было некорректным приведением типов, а (T1)4 корректным; тогда значение 4 компилятор пропустит, а значение 8 нет.
0
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
30.12.2012, 22:45 24
Вот проблема в том, что constexpr говорит компилятору, что "это можно использовать при compile-time-вычислениях", но он позволяет использовать определяемое не только в compile-time. Поэтому static_assert в конструктор или приводилку типов не влепить, если только не задавать значения действительно только в compile-time — шаблонами: писать какой-нибудь T1<8>. Так что в принципе можно изнасиловать синтаксис и сделать compile-time-проверку для инициализации каким-то int_<8> и runtime-проверку на обычные инты. Но толку-то?

И альтернативы этому не появится, пока в каком-нибудь очередном C++17 не будет полноценных макросов.
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
31.12.2012, 09:24 25
А макросы чем помогут? Ошибку в самом запрете/разрешении значения компилятор проглотит всё равно.
0
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
31.12.2012, 11:20 26
Да они тоже не особо альтернатива. Но они могут обломать компиляцию, если значение не подходит. Просто для int_<8>-то хватит и примитивного #define I(v) int_<v>(), но не для более сложных объектов, где пригодится гарантированно compile-time constexpr, но не с таким сногсшибательным синтаксисом как у темплейтов. Это даже могут быть не макросы, а именно просто compile-time-only constexpr (кодогенерацию при компиляции мейнстрим чё-то пока не заценил).

Но вопрос "на кой хрен" остаётся в силе. Конечно, можно сделать так, чтобы писать Constrained<int, Or<InRange<2, 42>, Not<Even>, Equals<67, 98>>, но ведь проблему зависимости типов это не решит. Эту хрень можно будет гарантированно скастовать только к инту. Остальные касты будут выполняться вместе с проверками в рантайме, а значит, особо нет толку от написания всех ограничений на шаблонах (которые как бы намекают, что проверки на валидность кастов должны выполняться лишь при компиляции), если всё равно 99% проверок будут выполняться в рантайме.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
31.12.2012, 11:37 27
Цитата Сообщение от kravam Посмотреть сообщение
Мне не даёт покоя разговор с одним программистом, имевший место быть несколько лет назад. Тот сказал, что он так кодит, что у него неправильный код просто-напросто не компилится, а я не стал уточнять. Многое я бы отдал, чтобы вернуться к тому разговору!
Основная масса способов, которая растёт преимущественно из Си++ - это способы испоганить исходник на ровном месте. Не надо гнаться за тем, чтобы идиотскими способами ловить ошибки на этапе компиляции. На этапе компиляции надо ловить то, что ловится просто. А сложные вещи лучше пытаться ловить в рантайме, но максимально близко к точке возникновения ошибки. В очередной раз наблюдаю у тебя повышение уровня осознания, так что можешь попробовать почитать тут: https://www.cyberforum.ru/blogs/18334/blog104.html (правда до конца так и не написано)
0
31.12.2012, 11:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.12.2012, 11:37
Помогаю со студенческими работами здесь

Как заставить компилятор применить нужную команду
Всем , здравствуйте! Простой такой кодик , но не работает. Т.к компилятор вместо команды SUBI -...

Как заставить компилятор выводить имя файла?
Всем привет! Компилятор GCC. Из Readme: Проблема вот в чем. Создал батник, для экономии...

Как заставить компилятор делать определенный отступ между методами
Сабж. Отступ в 1 строчку меня не устраивает. Хотя бы 2-3. Вручную лень, хочу автоматизировать. То...

Как заставить компилятор давать имена символам, соответствующие названиям функций?
Здравствуйте! Пишу динамическую библиотеку, в которой имплементирую функцию run() - эта функция...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru