Каково значение __STDC_VERSION__ для C23?

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

Изменения, новые функции и исправления серии выпусков GCC 14 теперь добавлен флаг std=c23, но не упоминается, что __STDC_VERSION__ расширяется.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
170
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

От N3220:

__STDC_VERSION__ Целочисленная константа 202311L

популярное имя версия постоянный С23 пятый 202311L С17/18 четвертый 201710L С11 третий 201112L С99 второй 199901L С?? во-первых, поправка 1 199409L

Это было в первой редакции C89/90, поправка 1, где был добавлен предопределенный макрос __STDC_VERSION__. Я не уверен, что у него есть какое-то популярное имя, но предлагалось C94/95.

Для Нормативной поправки 1 к стандарту C 1990 года Wiki предлагает неофициальное название C95. Я также видел C94 и C94/95.

chux - Reinstate Monica 05.06.2024 17:52

@chux-ReinstateMonica Отлично, спасибо! Я сделал грубую правку (я сейчас разговариваю по телефону).

Ted Lyngmo 05.06.2024 18:00

Хороший. Я предпочитаю C94, так как через много лет все, что нас волнует (с точки зрения даты), это 199409L, а не его официальная дата выпуска. То же самое и с C17 с его 201710L.

chux - Reinstate Monica 05.06.2024 18:07

К счастью, названия C94 или C95 и их значение __STDC_VERSION__ в наши дни очень редко актуальны.

Jonathan Leffler 05.06.2024 20:18

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.

Jonathan Leffler 05.06.2024 20:27

@JonathanLeffler Отлично! Имея это в виду, я мог бы/должен добавить пару столбцов для нестандартных значений __STDC_VERSION__ (если таковые имеются). Несколько лет назад у меня была большая проблема с чем-то подобным, когда дело касалось MSVC __cplusplus, и это было безумие :)

Ted Lyngmo 06.06.2024 00:42

Эмпирически 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 странное.

Harith 05.06.2024 20:41

@Харит — Верно! Но #if __STDC_VERSION > 201710L будет оценено как правда.

Jonathan Leffler 05.06.2024 20:43

Поиск на веб-сайте ISO сегодня по номеру 9899 (номер стандарта C) предполагает, что вы, возможно, сможете купить DIS (проект международного стандарта) за 129 швейцарских франков (швейцарских франков). OTOH, вам (или вашей организации), возможно, потребуется быть членом ISO — на странице написано: «Этот проект международного стандарта находится на стадии рассмотрения членами ISO».

Jonathan Leffler 05.06.2024 20:46

Черновая версия 2024 года доступна по адресу port70.net/~nsz/c/c23/n3220.pdf Черновик 2022 года можно найти по адресу iso-9899.info/n3047.html

Andrew Henle 06.06.2024 00:07

Я решил написать отчеты об ошибках, если ожидаемое не происходит. Поначалу MS очень-очень сопротивлялась, но я был всего лишь одним из многих, кто хотел, чтобы их макросы препроцессора вели себя очень близко к тому, что вы ожидаете - и сейчас это намного лучше. Там не все так, но гораздо лучше.

Ted Lyngmo 06.06.2024 00:51

Другие вопросы по теме