Что такое значение STDC_VERSION для C11? спрашивает о C11 и Как я могу использовать «nullptr» для нулевых указателей до C23? говорит, что текущие версии GCC и Clang определяют его по значению заполнителя 202000L.
Изменения, новые функции и исправления серии выпусков GCC 14 теперь добавлен флаг std=c23, но не упоминается, что __STDC_VERSION__ расширяется.





От N3220:
__STDC_VERSION__ Целочисленная константа 202311L
202311L
С17/18
четвертый
201710L
С11
третий
201112L
С99
второй
199901L
С??
во-первых, поправка 1
199409LЭто было в первой редакции C89/90, поправка 1, где был добавлен предопределенный макрос __STDC_VERSION__. Я не уверен, что у него есть какое-то популярное имя, но предлагалось C94/95.
@chux-ReinstateMonica Отлично, спасибо! Я сделал грубую правку (я сейчас разговариваю по телефону).
Хороший. Я предпочитаю C94, так как через много лет все, что нас волнует (с точки зрения даты), это 199409L, а не его официальная дата выпуска. То же самое и с C17 с его 201710L.
К счастью, названия C94 или C95 и их значение __STDC_VERSION__ в наши дни очень редко актуальны.
GCC 14.1.0 задокументирован как поддерживающий -std=X, где значения для X включают iso9899:1990, iso9899:199409, iso9899:1999, iso9899:2011iso9899:2017, iso9899:2018 и (c23 или) iso9899:2024. AFAIK, ISO до сих пор не опубликовал C23. Я не уверен, что это за задержка. Комитет работает над C26.
@JonathanLeffler Отлично! Имея это в виду, я мог бы/должен добавить пару столбцов для нестандартных значений __STDC_VERSION__ (если таковые имеются). Несколько лет назад у меня была большая проблема с чем-то подобным, когда дело касалось MSVC __cplusplus, и это было безумие :)
Эмпирически GCC 14.1.0 по-прежнему печатает номер версии-заполнителя 202000 при компиляции с -std=c23 или -std=iso9899:2024:
#include <stdio.h>
int main(void)
{
printf("__STDC_VERSION__ = %ld\n", __STDC_VERSION__);
return 0;
}
Компиляция и выполнение:
$ gcc --version
gcc (GCC) 14.1.0
Copyright (C) 2024 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ gcc -O cv67.c -o cv67 && cv67
__STDC_VERSION__ = 201710
$ gcc -O -std=c23 cv67.c -o cv67 && cv67
__STDC_VERSION__ = 202000
$ gcc -O -Wall -Werror -Wextra -std=iso9899:2024 cv67.c -o cv67 && cv67
__STDC_VERSION__ = 202000
$ gcc -O -Wall -Werror -Wextra -std=iso9899:2011 cv67.c -o cv67 && cv67
__STDC_VERSION__ = 201112
$ gcc -O -Wall -Werror -Wextra -std=iso9899:1999 cv67.c -o cv67 && cv67
__STDC_VERSION__ = 199901
$ gcc -O -Wall -Werror -Wextra -std=iso9899:199409 cv67.c -o cv67 && cv67
__STDC_VERSION__ = 199409
$ gcc -O -Wall -Werror -Wextra -std=iso9899:1990 cv67.c -o cv67 && cv67
cv67.c: In function ‘main’:
cv67.c:4:40: error: ‘__STDC_VERSION__’ undeclared (first use in this function)
4 | printf("__STDC_VERSION__ = %ld\n", __STDC_VERSION__);
| ^~~~~~~~~~~~~~~~
cv67.c:4:40: note: each undeclared identifier is reported only once for each function it appears in
$
Таким образом, GCC 14.1.0 по умолчанию использует C17/C18 и использует __STDC_VERSION__ == 202000 для C23.
То есть проверка __STDC_VERSION__ >= 202311L с флагом std=c23 в GCC 14.1 будет равна false? Я проверил документацию Clang 18.1, и там указано, что для C23 используется 202311L. Поведение GCC странное.
@Харит — Верно! Но #if __STDC_VERSION > 201710L будет оценено как правда.
Поиск на веб-сайте ISO сегодня по номеру 9899 (номер стандарта C) предполагает, что вы, возможно, сможете купить DIS (проект международного стандарта) за 129 швейцарских франков (швейцарских франков). OTOH, вам (или вашей организации), возможно, потребуется быть членом ISO — на странице написано: «Этот проект международного стандарта находится на стадии рассмотрения членами ISO».
Черновая версия 2024 года доступна по адресу port70.net/~nsz/c/c23/n3220.pdf Черновик 2022 года можно найти по адресу iso-9899.info/n3047.html
Я решил написать отчеты об ошибках, если ожидаемое не происходит. Поначалу MS очень-очень сопротивлялась, но я был всего лишь одним из многих, кто хотел, чтобы их макросы препроцессора вели себя очень близко к тому, что вы ожидаете - и сейчас это намного лучше. Там не все так, но гораздо лучше.
Для Нормативной поправки 1 к стандарту C 1990 года Wiki предлагает неофициальное название C95. Я также видел C94 и C94/95.