Инициализировать статическую переменную с аргументом функции - PullRequest
0 голосов
/ 28 ноября 2018

Как я могу сделать что-то подобное?

void function(int n)
{
    static int number = n;
    .
    .
    .
}

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Если вы хотите инициализировать статическую переменную на n во время первого вызова функции, вы можете сделать это следующим образом:

void function(int n)
{
    static int initialized = 0;
    static int number;

    if (!initialized) {
        number = n;
        initialized = 1;
    }
    .
    .
    .
}

Вы не можете инициализировать number в n непосредственно, поскольку number инициализируется во время компиляции, тогда как n известен только во время выполнения.

0 голосов
/ 28 ноября 2018

Вы не можете.

Цитирование стандарта C11, глава §6.7.9 / P4

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

Для уточнения объекты с продолжительностью хранения static инициализируются только один раз, перед выполнением в программе.Таким образом, невозможно использовать значение времени выполнения для использования в качестве явного инициализатора.

Связано с главой §6.2.4

Объект, идентификатор которого объявлен[...] со спецификатором класса хранения static, имеет статическую продолжительность хранения.Его время жизни - это полное выполнение программы, а его сохраненное значение инициализируется только один раз, до запуска программы.

...