При компиляции этого кода в последней версии gcc (или clang) с -std=c17 -pedantic-errors -Wall -Wextra
static const int y = 1;
static int x = y;
тогда я не получаю диагностического сообщения компилятора, хотя я вполне уверен, что это недействительный C, а нарушение ограничения. Мы можем доказать, что это не соответствует требованиям, посмотрев на C17 6.7.9 / 4:
Ограничения
...
Все выражения в инициализаторе для объекта, который имеет статическую продолжительность или продолжительность хранения потока, должны быть константными выражениями или строковыми литералами.
Затем определение константных выражений, в данном случае целочисленное постоянное выражение (6.6):
Целочисленное константное выражение должно иметь целочисленный тип и содержать только операнды, которые являются целочисленными константами, константами перечисления, символьными константами, выражениями sizeof, результатами которых являются целочисленные константы, выражения _Alignof и плавающие константы, которые являются непосредственными операндами. слепков.
И, наконец, определение целочисленных констант (6.4.4.1/2):
Целочисленная константа начинается с цифры, но не имеет периода или экспоненты. Он может иметь префикс, определяющий его основу, и суффикс, определяющий его тип.
Таким образом, переменная const int
не является ни целочисленной константой, ни выражением целочисленной константы. Следовательно, это недопустимый инициализатор. Это обсуждалось ранее (например, здесь), и я думаю, что уже установлено, что это не соответствует требованиям. Однако мой вопрос:
Почему gcc решил не соответствовать требованиям даже в строгом режиме?
clang, по-видимому, всегда был несовместимым, но gcc изменился с совместимого в версии 7.3 на несовместимый в версии 8.0 и выше. gcc 7.3 и ранее выдает ошибку: элемент инициализатора не является постоянным даже в режиме по умолчанию без -pedantic-errors
.
Похоже, что в отношении этого сообщения было принято какое-то активное, осознанное решение. Почему он был полностью удален в gcc и почему его не оставили как было при компиляции в строгом режиме -std=c17 -pedantic-errors
?
-std=c17 -pedantic-errors
должен быть строгим режимом. Я не компилирую-std=gnu17
и не хочу, чтобы присутствовали какие-либо расширения компилятора. - person Lundin   schedule 05.07.2021