В C
, есть ли способ обеспечить вызов функции только один раз без использования pthread_once
?
Следующее работает в C++
, но, очевидно, не в C
, поскольку инициализациястатическая переменная должна быть постоянной (как я понимаю, ошибка компиляции)
// main.c
int func()
{
return 42;
}
int main( int argc, char* argv[] )
{
static int i = func();
return 0;
}
Я думал, что использование оператора запятой может обойти это, но это тоже не работает:
// main.c
int func()
{
return 42;
}
int main( int argc, char* argv[] )
{
static int i = ( func(), 42 );
return 0;
}
Компиляция обоих приводит к следующей ошибке компиляции:
> gcc -g main.c
main.c: In function 'main':
main.c:10:18: error: initializer element is not constant
Есть ли способы обойти это и гарантировать, что функция вызывается только один раз (из области вызывающей функции) без использования pthread_once
?
Если быть точным, я не хочу возвращать рано с func()
, если он был вызван один раз, меня интересует заверение во время компиляции, что func()
только вызывается один раз из области вызывающей функции - то есть аналогично тому, как C++
будет обрабатывать вышеуказанный код.
(Другими словами, приведенный выше код допустим для компилятора C++
, который обеспечивает func()
вызывается только один раз - яs есть эквивалентный способ сделать это в C
без pthread_once
?)
РЕДАКТИРОВАТЬ:
Я не сформулировал это идеально в оригинальном сообщении: я искалдля решения, которое не включает в себя функции или переменные оболочки / помощника;то есть мне было любопытно узнать, существует ли конструкция на языке C
, которая позволяет обрабатывать эту ситуацию эквивалентно тому, как она обрабатывается в C++
.Решение jxh подходит лучше всего, используя расширение gcc
.