Member 12928053 Ответов: 3

Статическая переменная в функции работает не в C, а в C++


Окей...Эта проблема сводит меня с ума...
но код довольно прост,и я уже погуглил его.

Код :

void f(int c) {
	static int foo = c;
}


Вот что я погуглил"Эд"

Разница между static в C и в C++статические?? - переполнение стека[^]

Он говорит, что статика в C "равнозначна" C++.
но мой компилятор просто продолжает говорить

"Initializer element is not constant"

и еще я погуглил его, он просто продолжает говорить о "постоянной" проблеме....
но 'как const' - это не то, что я хочу, мне просто нужно, чтобы зарезервировать переменной 'Foo' !

Что я уже пробовал:

Гугл

3 Ответов

Рейтинг:
28

Albert Holguin

Статика более "похожа", чем" эквивалентна " между C/C++....

Вот объяснение того, что вы видите:
Инициализация статических переменных в C-GeeksforGeeks[^]

Порядок инициализации в C означает, что статика должна быть определена из константы (это не означает, что значение должно оставаться постоянным). Это требование отсутствует в C++, потому что порядок инициализации немного отличается в C++, и статика больше не инициализируется перед "main", а скорее при первом их появлении (во всяком случае, для статики в теле функции).


nv3

5.

Member 12928053

Большое вам спасибо за это объяснение.
Это очень помогает мне, Боже...Наконец я решаю эту проблему.
кстати, мой второй exmaple определенно ошибся, я забыл проверить init.

Рейтинг:
2

Jochen Arndt

В C статические переменные могут быть инициализированы только постоянными значениями, но параметры функций не являются постоянными.

В вашем случае решение довольно простое. Разделите команду на инициализацию и назначение:

void f(int c) {
    static int foo = 0;
    foo = c;
}


Albert Holguin

Это будет компилироваться...за исключением того, что это не даст вам ожидаемых результатов... потому что значение foo будет инициализироваться в c каждый раз, когда F () вызывается, а не только в первый раз.

Jochen Arndt

Как с помощью C++ и просил прокомментировать его втором примере:
- "фу" всегда должно быть равно "бар"."

Распространенным решением для инициализации первого вызова является инициализация зарезервированным значением типа -1:

static int foo = -1;
если (-1 == foo) foo = c;

Albert Holguin

Да, у опа была противоречивая информация, я думаю, он имел в виду, что foo должен быть равен bar только на первой итерации.

Рейтинг:
0

Richard MacCutchan

Сообщение об ошибке ясно говорит вам, что не так. Вы пытаетесь инициализировать статическую константу из значения, которое неизвестно во время компиляции.