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