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

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

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

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

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

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

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

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

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

26
 Аватар для CableGuy
15 / 15 / 2
Регистрация: 29.03.2012
Сообщений: 41
29.12.2012, 15:22
C++
1
const int p;
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
29.12.2012, 15:32
Цитата Сообщение от CableGuy Посмотреть сообщение
C++
1
const int p;
А вот так
C
1
 BabFunc((int *)(&p));
не удастся ли обмануть? Или даже
C
1
 (int) p = 8;
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
29.12.2012, 15:43
kravam, Средствами языка все же никак. Присвоение ведь идет не на этапе компиляция
0
113 / 113 / 28
Регистрация: 05.07.2009
Сообщений: 225
29.12.2012, 15:49
kravam, заблокировать присвоение переменной определённого значения до этапа компиляции конечно возможно (теоретически, с использованием интерпретатора), однако бессмысленно, т.к большинство программ получает данные извне, что невозможно контролировать на этапе компиляции. Если же ваша переменная не зависит от внешней среды и входных данных, то лучше, наверное, написать для неё специальный класс и перегрузить оператор присваивания, так будет гораздо проще
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
29.12.2012, 15:54
Если переменной присваивается значение на стадии компиляции, то static_assert. Если в рантайме - assert.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
29.12.2012, 16:00
diagon, static_assert соглашусь. assert - нет. первое - не этап компиляции, второе - только отладочный режим.
0
29.12.2012, 16:00

Не по теме:

Использовать Haskell.

1
96 / 96 / 21
Регистрация: 25.04.2012
Сообщений: 449
29.12.2012, 17:19
не по теме, но как-то на защиту к нам зашел другой преподаватель, и когда я заговорил о константах, он сказал "а хочешь я докажу, что констант не существует?", правда я ответил "нет спасибо" и он не стал говорить, но, всё же, что он имел ввиду?
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
29.12.2012, 17:33
Например, это.
Или это.
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
29.12.2012, 17:35
diagon, а как же constexpr?
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
30.12.2012, 12:23
Цитата Сообщение от kravam Посмотреть сообщение
он так кодит, что у него неправильный код просто-напросто не компилится, а я не стал уточнять.
А как он может скомпилиться?
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
30.12.2012, 12:44
Цитата Сообщение от taras atavin Посмотреть сообщение
А как он может скомпилиться?
Легко. Вот это неправильный код, реализующий умножение двух чисел:
C++
1
2
3
4
int mul(int a, int b)
{
    return a + b;
}
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
30.12.2012, 12:46
По языку здесь всё правильно, синтаксическую проверку прога пройдёт.
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
30.12.2012, 12:47
Вот только функция не делает то, что должна делать.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
30.12.2012, 12:47
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Вот это неправильный код, реализующий умножение двух чисел:
Код правильный, точнее валидный но компилятор же не знает что нужно программисту. Тут логика не та и это уже не заботы компилятора. В конце концов, если клавиатура сломана, он еще и печатать должен за программиста?

Компьютер невероятно быстрая и в тоже время необычайно тупая машина. Не помню в какой книге вычитал(точно учебник Си++).
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
30.12.2012, 13:13
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Вот только функция не делает то, что должна делать.
С чьей точки зрения должна? Она делает то, как написана, то есть то, что должна делать с точки зрения компилятора. А то, что "программист" не понимает смысла собственных действий, к делу не относится. Чтоб не допускать семантических ошибок, надо думать, что пишешь, и знать язык, а синтаксически функция правильна.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
30.12.2012, 14:33  [ТС]
Так-то из области фантастики задача, но хоть ЧТО-ТО мы ведь можем проконтролировать? Щас вот изучаю C# так там прямо сказано- они частично ошибки времени выполнения делаю ошибками компиляции с помощью хитрой какой-то перетипизации

++++++++++++++++++++++++++++++++++++++++ +++

Ну вот допустим я пишу так (ошибочно!)
C++
1
int p= 8;
То есть я не должен присваивать переменной p значение 8, а я присвоил. Это же можно как-то проконтролировать? Например использовать не переменнную типа int, а создать класс, в котором инкапсулировать переменную int; и сделать так чтобы в правой части была тоже не переменная int, а переменная какого-нибудь хитрого класса. И чтобы объекты этого класса не могли принимать значение 8

Ну то есть чтобы был контроль типов. Чтобы логика компилятора была примерно такая:
C++
1
T p= 8;
1) Смотрим перегруженный оператор = класса T
2) Определяем, что параметром к этому оператору может идти какой-нибудь класс T1
3) Пытаемся перетипизировать (T1)8, а не получается
4) Вот и ошибка компиляции. Как-то так.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
30.12.2012, 15:08
Цитата Сообщение от kravam Посмотреть сообщение
Смотрим перегруженный оператор = класса T
2) Определяем, что параметром к этому оператору может идти какой-нибудь класс T1
3) Пытаемся перетипизировать (T1)8, а не получается
4) Вот и ошибка компиляции. Как-то так.
Конструктор не работает на этапе компиляции и как ты не проверяй параметр в конструкторе, компилятор не сможет понять, чего ты хотел. Он может только формально перевести текст в код, но не проанализировать логику на предмет того, какую сгенерить "пользовательскую" гугломессагу. Он понимает лишь алгоритмы, но не их назначение. Единственное, как можно конкретное значение запретить при компиляции, это сделать его не представимым, например, сократить разрядность до 3-х бит, тогда диапазон представимых чисел от ноля до семи, восемь в него не входит.

Добавлено через 1 минуту
Можно, конечно, каждое разрешённое значение закейсовать, но это перенос проблемы и её усугубление, а не решение: можно ошибиться при написании миллиардов кейсов и компилятор это проглотит.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
30.12.2012, 15:50
taras atavin, Это знаете-ли неправда. constexpr конструкторы никто не отменял.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.12.2012, 15:50
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru