2 / 2 / 0
Регистрация: 26.12.2013
Сообщений: 44
|
|
1 | |
Константы и C++14.03.2014, 15:26. Показов 3579. Ответов 36
Метки нет (Все метки)
0
|
14.03.2014, 15:26 | |
Ответы с готовыми решениями:
36
Ввод константы Вычисляемые константы Константы и указатели Инициалиация константы |
alsav22
|
26.10.2014, 02:45
Константы и C++
#21
|
0
|
Вездепух
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,062
|
|
26.10.2014, 03:07 | 23 |
Компиляторы С++ могут реализовывать какие угодно расширения, но в любом случае они обязаны выдавать диагностические сообщения в ответ на формально ошибочный код. Если какой-то компилятор С++ "расширяет" неопределенную часть спецификации языка, он может делать это молча. Но если какой-то компилятор С++ "расширяет" значение определенно ошибочного кода, он будет выдавать диагностическое сообщение.
Компилятор, который проглатывает вышеприведенный код молча не является компилятором С++. В частности, язык программирования, который реализуется компилятором g++ в режиме по умолчанию называется GNU++. Не надо путать его с С++, даже если эти языки несколько похожи друг на друга. Неверно. Диагностические сообщения, указывающие на грубые ошибки в коде, не являются лишними, а являются обязательными.
0
|
26.10.2014, 03:35 | 24 |
Неверно. Запись типа: int c = 7; float x[c]; не является ошибкой.
Добавлено через 2 минуты Настоящие компиляторы никому не обязаны, ни к чему не привязаны.
0
|
Вездепух
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,062
|
|
26.10.2014, 03:39 | 25 |
Повторяю еще раз. Язык С++ запрещает использование неконстантных выражений для указания размера массива. Код 'int c = 7; float x[c];' является ошибочным. (О чем вам, кстати, охотно сообщит тот же компилятор GCC, если вы запустите его в режиме С++.)
Я не предлагаю это к обсуждению. Я даю это под запись для обязательного запоминания. Добавлено через 1 минуту Да да, конечно...
1
|
Вездепух
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,062
|
|
26.10.2014, 03:51 | 27 |
Ну, как говорится, есть многое на свете, друг Горацио... По мере появления осмысленного опыта вы еще и не такое узнаете. Я вам даже в некотором смысле завидую...
Да вроде бы все в на соответствующих страничках подробно описано... Да и разжевано было уже сто раз вдоль и поперек на каждом уважающем себя форуме. Как можно этого не знать? g++ -std=c++11 -pedantic test.cpp Код
test.cpp: In function ‘int main()’: test.cpp:3:12: warning: ISO C++ forbids variable length array ‘f’ [-Wvla] float f[c]; ^
0
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
|
26.10.2014, 04:19 | 29 |
Не выдает, в этом и дело.
Даже в режиме -std=c++11, который как бы намекает нам на то, какой язык мы используем, диагностика не выдается и код компилируется. Вот пруф. Чтобы он начал выдавать предупреждение, нужно включить флаг -pedantic, или конкретно -Wvla. Переключения в режим С++11 или С++03, как видно, недостаточно. Эта игра слов мне не нравится и вот почему: 1. gnu++ - это не язык, а набор расширений, которые реализует компилятор для с++. 2. Если некоторое множество расширений входит в компилятор по-умолчанию, это совершенно не значит, что данный компилятор не является компилятором С++. Компилятором С++ не является только тот компилятор, который не реализуется стандарт С++. А в стандарте С++ нет никаких явных запретов на расширения, так же, как нет конкретных требований для диагностики (есть рекомендации, более или менее жесткие, но нет конкретных указаний: "выдать ошибку" или "выдать предупреждение"). Следовательно тезис про то, что G++ - это не компилятор С++ ошибочен. Хочу также напомнить вот что: в стандарте существует практика указания на жесткость требований, посредством использования определенных форм модальных глаголов. Вот например про массивы: 8.3.4 12.8/19 Очень часто разработчики компиляторов используют эти формулировки для того, чтобы определить уровень диагностики. Так что, до тех пор, пока в документе не повысится жесткость требований, трактовать отсутствие constant expression в качестве размерности массива как ошибку совсем необязательно. При этом мы не нарушим букву стандарта, следовательно останемся в рамках С++. Это я к чему: Ошибка и расширенное поведение - это разные вещи. Плюс к этому, по цитатам выше видно, что стандарт не накладывает требований "обязан" (must) на размерность массива, оставляя лишь более слабое "должен" (shall).
0
|
programina
|
26.10.2014, 04:22
#30
|
Не по теме: Кстати, а правда ли, что от прописывания -std=c++11 GCC становится более плюсистым? )
0
|
Вездепух
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,062
|
|
26.10.2014, 04:49 | 31 |
Хорошо, пусть будет недостаточно. Действительно нужен флаг '-pedantic' или '-pedantic-errors' - флаги, которые были введены в GCC специально для того, чтобы требовать стандартного поведения.
Термин GNU++ выдумал не я. Именно так данный диалект именуется в опциях GCC. А это здесь к чему? Я такого никогда не говорил. Я, кажется, ясно сказал выше, что компиляторы C++ могут реализовывать какие угодно расширения. В том числе и по умолчанию. Однако, стандарт языка четко требует, чтобы ill-fomed код всегда сопровождался диагностическим сообщением. Верно. Более того, есть явное разрешение на расширения. Но к чему вы мне об этом сообщаете? А вот что в стандарте есть, так это требование диагностики ill-formed кода, за исключением мест, где стандарт явно разрешает диагностики не делать. А вот тут уже пошла ерунда. Во-первых, чего стандарт С++ действительно не содержит, так это разделения на "ошибки" и "предупреждения". Такого разделения в С++ не существует. В С++ существует только понятие диагностического сообщения. Во-вторых, стандарт С++ содержит совершенно четкое требование на эту тему Вот именно! Вы, надеюсь, видите, что в данном случае использована форма "shall"? Это опять какая-то чепуха. Требование константности размера в декларации сделано с максимально возможным уровнем жесткости: "shall be". Его невозможно никуда "повысить". А, вот в чем ваша ошибка! Вы очевидно перепутали "shall" и "should". Повторяю еще раз "shall be" - это максимальный уровень жесткости требования в стандарте С++ (и в аналогичных документах), равный по строгости "must". Еще раз отсылаю вас к истокам: http://www.ietf.org/rfc/rfc2119.txt
0
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
|
26.10.2014, 05:00 | 33 |
Да это понятно, только в том же мане GCC написано, что диалект GNU всегда базируется на одном из стандартов (либо C либо C++). Я это указал к тому, что G++ - это С++ с расширениями, диалект, а не другой язык.
Почему ерунда? Я как раз именно о выделенном и говорил. Да, похоже именно в этом. Признаю, я действительно довольно давно смотрел эти документы и некоторые вопросы забылись. Пусть так, в этом вопросе я не прав. Т.е. как в таком случае следует понимать утверждение про g++? Он компилятором С++ является, только если указан ключ -pedantic? Именно с этим я и не согласен. Можно, в связи с вышеизложенным считать, что имеется ошибка в системе диагностики компилятора, которая приводит к отсутствию сообщения на обязательное требование стандарта, но никак не считать на этом основании, что g++ - это не компилятор С++. Просто если следовать предложенной формулировке, то на свете не найдется ни одного компилятора С++, потому что у каждого есть какие-либо расширения, в том числе неотключаемые.
0
|
Вездепух
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,062
|
|
26.10.2014, 05:14 | 35 |
Это у вас просто отсутствует понимание принципиальной разницы между флагом '-Wall' и флагом '-pedantic'. Читайте, как говорится, доки, они - рулез... Точнее, понимание, я думаю, мы вам уже сформировали. Но организм на первых порах по инерции сопротивляется. Это нормально.
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||||||
26.10.2014, 09:15 | 37 | |||||
Наоборот чтоб удобнее было менять на этапе разработки. Вот смотрите: приняли Вы какие то магические числа, например, 7 - это показать окно, 1 - скрыть, 0 - мигнуть на панели задач, а потом, когда эта семёрка ужа валяется в тысячах мест по всему проекту, вдруг решили, что показ окна будет 1, скрытие 2, а мигание 3. Переопределив каждую константу ровно в одном месте, можно поменять её значение сразу везде. Или есть у Вас статический массив и Вы вдруг через 5 версий программы решаете, что его надо увеличить его в 256 раз. Тоже удобно: поменял в одном месте и готово.
Добавлено через 3 минуты Но не так же.
0
|
26.10.2014, 09:15 | |
26.10.2014, 09:15 | |
Помогаю со студенческими работами здесь
37
встроенные константы в С++ (pi e) Статическе константы Экспоненциальные Константы New, константы, указатели Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |