Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Показать сообщение отдельно
DrOffset
8141 / 4722 / 1154
Регистрация: 30.01.2014
Сообщений: 7,692
26.10.2014, 04:19 0

Константы и C++

26.10.2014, 04:19. Просмотров 1545. Ответов 36
Метки (Все метки)

Ответ

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Но если какой-то компилятор С++ "расширяет" значение определенно ошибочного кода, он будет выдавать диагностическое сообщение.
Не выдает, в этом и дело.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
В частности, язык программирования, который реализуется компилятором g++ в режиме по умолчанию называется GNU++. Не надо путать его с С++, даже если эти языки несколько похожи друг на друга.
Даже в режиме -std=c++11, который как бы намекает нам на то, какой язык мы используем, диагностика не выдается и код компилируется. Вот пруф. Чтобы он начал выдавать предупреждение, нужно включить флаг -pedantic, или конкретно -Wvla. Переключения в режим С++11 или С++03, как видно, недостаточно.

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Компилятор, который проглатывает вышеприведенный код молча не является компилятором С++.
Эта игра слов мне не нравится и вот почему:
1. gnu++ - это не язык, а набор расширений, которые реализует компилятор для с++.
2. Если некоторое множество расширений входит в компилятор по-умолчанию, это совершенно не значит, что данный компилятор не является компилятором С++. Компилятором С++ не является только тот компилятор, который не реализуется стандарт С++. А в стандарте С++ нет никаких явных запретов на расширения, так же, как нет конкретных требований для диагностики (есть рекомендации, более или менее жесткие, но нет конкретных указаний: "выдать ошибку" или "выдать предупреждение"). Следовательно тезис про то, что G++ - это не компилятор С++ ошибочен.

Хочу также напомнить вот что: в стандарте существует практика указания на жесткость требований, посредством использования определенных форм модальных глаголов. Вот например про массивы:
8.3.4
If the constant-expression (5.19) is present, it shall be an integral constant expression and its value shall be greater than zero.
Ну и, к примеру, про оператор присваивания:
12.8/19
An overloaded assignment operator must be declared to have only one parameter
Есть и более слабые формы will be и can be.
Очень часто разработчики компиляторов используют эти формулировки для того, чтобы определить уровень диагностики. Так что, до тех пор, пока в документе не повысится жесткость требований, трактовать отсутствие constant expression в качестве размерности массива как ошибку совсем необязательно. При этом мы не нарушим букву стандарта, следовательно останемся в рамках С++.
Это я к чему:
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
но в любом случае они обязаны выдавать диагностические сообщения в ответ на формально ошибочный код.
Ошибка и расширенное поведение - это разные вещи. Плюс к этому, по цитатам выше видно, что стандарт не накладывает требований "обязан" (must) на размерность массива, оставляя лишь более слабое "должен" (shall).

Вернуться к обсуждению:
Константы и C++
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.10.2014, 04:19

Ввод константы
Имеется массив. Нужно чтоб пользователь вводил его размер, но для этого нужно...

Инициалиация константы
Здравствуйте, вообщем на шестом ВС вроде была такая возможность, а 2010...

встроенные константы в С++ (pi e)
Подскажите, существуют ли в С++ встроенные константы. Например pi=3.14.... ...

0
Другие темы раздела
C++ Код Хаффмена. Передача кодового дерева http://www.cyberforum.ru/cpp-beginners/thread1119091.html
Имеется файл. Провел его закодирование по коду Хаффмена, подсчитал частоты символов, построил кодовое дерево, произвол закодирование. Как передать таблицу кодов в файле? Например, имеется таблица...
C++ Написать программу для ввода строк символов с терминала Написать программу для ввода строк символов с терминала, организовать код. счет числа символов и слов в виде функций. Введенные строки сохранять в массиве. Вывести результаты расчета на монитор и в... http://www.cyberforum.ru/cpp-beginners/thread1119083.html
C++ C++ telnet
Добрый день! как из программы запустить telnet и передать команду например Help Спасибо
Работа с файлами C++
Ребят у кого есть возможность распишите как лучше сделать для лабы надо. Заранее спасибо Задание: Создать структуру Работник, со следующими полями: имя, номер отдела, зарплата. Разработать...
C++ Найти произведение элементов столбца, в котором расположен элемент с наибольшим значением http://www.cyberforum.ru/cpp-beginners/thread1119044.html
Помогите пожалуйста с реализацией задачи! :) В данной действительной квадратной матрице порядка n найти произведение элементов столбца, в котором расположен элемент с наибольшим значением....
C++ Заданы натуральные числа N, M и K Заданы натуральные числа N, M и K. Вычислить значение дроби с точностью до K знаков после запятой. Например, если дано N=13, M=7, K=5 , то ответ: 0,53846 . при к>25 :( Зарание спасибо!!! подробнее
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru