Проблема с const vs #define в Visual Studio - PullRequest
0 голосов
/ 09 апреля 2009

Насколько я понимаю, #define x y и const int x = y; должны работать одинаково в компиляторе Visual Studio, но const int x = y; является предпочтительным методом.

Код C у меня выглядит примерно так:

static const int x = 100000;

void SomeFunction(...)
{
    volatile static int y = x;
    ...
}

Проблема здесь с объявлением y. Если я использую #define для x, то проблем не возникает, но использование приведенного выше кода приводит к тому, что компилятор возвращает «error c2099: initializer не является константой».

Я пытаюсь скомпилировать из командной строки, и я не использую какие-либо флаги компилятора, поэтому я не уверен, нужно ли мне устанавливать флаг, чтобы компилятор оптимизировал const - или если Я наткнулся на какой-то особый случай.

Компиляция программы как программы на C ++ также работает, но я бы предпочел этого избежать, если это возможно.

Ответы [ 2 ]

2 голосов
/ 09 апреля 2009

Я не знаю стандарт C наизнанку, но я читал об этом раньше. Вот мое понимание.

Строгий компилятор ANSI C позволит вам использовать только константные выражения в качестве инициализаторов. Обратите внимание, что константное выражение может включать только литеральные значения, а не переменные с квалификацией const.

Я полагаю, это потому, что во время компиляции компилятор должен вычислить значение для инициализации, чтобы он мог статически поместить это значение в стек без каких-либо вычислений, требуемых во время выполнения. Даже переменные с квалификацией const могут изменяться (путем удаления квалификатора const и изменения значения).

const int x = 5;
*(int *)&x = 3;

Я думаю, что C99 позволяет вам инициализировать переменными с константной квалификацией только в области действия функции, переменные области файла все еще связаны с тем же ограничением.

0 голосов
/ 09 апреля 2009

Это можно решить с помощью другой защитной переменной:

void SomeFunction(...)
{
    static int initialized_y=0;
    volatile static int y;
    if(initialized_y==0)
       y = x;
    initialized_y=1;
    ...
}

Вы также можете превратить эту идиому в макрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...