2015-07-11 3 views
4

Следующий код, похоже, скомпилирован.Можно ли использовать переменную в инициализаторе структуры в C?

typedef struct Test { 
    int i; 
    int j; 
} Test; 

int main() { 
    int i; 
    i = 0; 
    Test p = {i, 1}; 
    printf("%d\n", p.i); 
    return 0; 
} 

Splint терпит неудачу с

example2.c:9:7: Parse Error. (For help on parse errors, see splint -help 
      parseerrors. 

(Это линия Test p = {i, 1};)

Является ли это незаконным C, или это ошибка в лубок?

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

+2

C99 [разрешает] (http://ideone.com/MmU9X9). – dasblinkenlight

ответ

2

Это законно, так как C99, так как это переменная auto. Однако это не является законным для глобальных и static переменных. gcc также допускает это для pre-C99 в качестве расширения (все же auto только, конечно).

я обычно рекомендую использовать по крайней мере С99-совместимые компиляторы, так как есть некоторые тонкие отличия от ранее стандартных и C99 содержит множество полезных функций, таких как C++ строчных комментариев, _Bool и т.д.

Примечание: p инициализируется во время выполнения и каждый раз, когда вызывается функция (main обычно вызывается только один раз, но здесь также применяется правило). Неважно, если вы делаете это const или нет. В общем случае для переменных const (sic!) Лучше также иметь их static или глобально для экономии времени выполнения. OTOH, это (см. Выше) запрещает переменную инициализатора.

+0

Это также относится к переменным 'register'. – fuz

+0

@FUZxxl: 'register' подразумевает' auto'. – Olaf

+0

В действительности p зависит от пользовательского ввода, и поэтому я не думаю, что действительно имеет смысл сделать его «статическим» (хотя, поскольку он находится в основной функции, это не имеет никакого значения, как вы говорите.) Я 't означает «это постоянное значение для всех вызовов этой функции», иначе я мог бы объявить его вне функции. Я просто хочу предотвратить случайное изменение его функции в функции. –

1

Инициализаторы, подобные этим, являются функцией C99. Я не знаю шины, но руководство по шинам застряло в 2003 году - это означает, что сплошная шина вероятности просто не говорит на C99.

Смежные вопросы