gcc: функции constexpr в C23?

Поигравшись с GCC v14.0 (который должен быть близок к выпуску GCC v13.1), я скомпилировал следующий модуль:

      constexpr int f (int x)
{
    return x + 2;
}

constexpr const int x[] = { f(1) };

сgcc -std=c2x -c foo.c -O2но GCC выдает:

      foo.c:1:1: error: 'constexpr' requires an initialized data declaration
   1 | constexpr int f (int x)
     | ^~~~~~~~~
[...f'up errors due to the one above...]

Согласно предложению C23 (pdf), это должен быть правильный синтаксис. Однако в этом PDF-файле нет никаких примеров, так чего же мне здесь не хватает?

GCC может справиться сconstexprначиная с C++11, поэтому реализация его во внешнем интерфейсе C должна быть известной и зрелой технологией.

2 ответа

Предложение N2851 , на которое вы ссылались, не было принято.

В проект C23 был включен только N3018 , и это предложение не включает функции, а только объекты.

Итак, с черновиком

      constexpr int x[] = { 3 };

и

      constexpr int i = 1;
constexpr int x[] = { i + 2 };
static int y[] = { i + 2 };

разрешены, но вы не можете вызвать функцию в инициализаторе или пометить функцию.

Кстати, добавлять не надо.constexprподразумевает высший уровеньconst.

В отличие от C++, в C спецификатор класса хранения может использоваться только для определений объектов.

Итак, это объявление функции

      constexpr int f (int x)
{
    return x + 2;
}

неверно, и, следовательно, компилятор выдает ошибку.

The constexprСпецификатор класса хранения включен в стандарт C23 согласно следующему документу

      N3018 constexpr for Object Definitions
Другие вопросы по тегам