2012-03-01 3 views
2

Я пытался это сделать в ANSI C:Объявить локальные переменные C89 в начале области?

include <stdio.h> 
int main() 
{ 
    printf("%d", 22); 
    int j = 0; 
    return 0; 
} 

Это не работает в Microsoft Visual C++ 2010 (в проекте ANSI C). Вы получаете ошибку:

error C2143: syntax error : missing ';' before 'type' 

Это работает:.

include <stdio.h> 
int main() 
{ 
    int j = 0; 
    printf("%d", 22); 
    return 0; 
} 

Сейчас я читаю во многих местах, которые вы должны объявлять переменные в начале блока кода существуют переменные в Является ли это вообще true для ANSI C89?

Я нашел много форумов, где люди давали этот совет, но я не видел его в любом официальном источнике, например, в руководстве GNU C.

ответ

3

ANSI C89 требует, чтобы переменные объявлялись в начале области. Это расслабляется на C99.

Это полезна с gcc, когда вы используете флаг -pedantic, который более строго соблюдает стандартные правила (поскольку он по умолчанию используется для режима C89).

Примечание хотя, что это правильный код C89:

include <stdio.h> 
int main() 
{ 
    int i = 22; 
    printf("%d\n", i); 
    { 
     int j = 42; 
     printf("%d\n", j); 
    } 
    return 0; 
} 

Но использование скобок для обозначения сферы (и, таким образом, срок службы переменных в этой области видимости), кажется, не особенно популярны, Таким образом, C99 ... и т.д.

3

Это абсолютно верно для C89. (Вам лучше смотреть документацию на язык, например, книги и стандарты. Документация компилятора обычно только документирует различия между языком, который поддерживает компилятор, и ANSI C.)

Однако многие компиляторы «C89» позволяют поместите объявления переменных почти в любом месте блока, если только компилятор не находится в строгом режиме. Сюда входит GCC, который можно ввести в строгий режим с -pedantic. Clang по умолчанию имеет цель C99, поэтому -pedantic не повлияет на то, можно ли смешивать объявления переменных с кодом.

MSVC имеет довольно плохую поддержку для C, я боюсь. Он поддерживает только C89 (старый!) С несколькими расширениями.

2

Now I read at many places that you have to declare variables in the beginning of the code block the variables exist in. Is this generally true for ANSI C 89?

Да, это требуется в синтаксисе составного оператора в C89/C90 Стандарт:

(C90, 6.6.2 Compound statement, or block)

Syntax

compound-statement

{ declaration-list_opt statement-list_opt }

Декларация должна быть до заявления в блоке.

C99 смягчил это, разрешив смешивание деклараций и утверждений в блоке. В стандарте C99:

(C99, 6.8.2 Compound statement)

Syntax

compound-statement:

{ block-item-list_opt }

block-item-list:

block-item

block-item-list block-item

block-item:

declaration

statement

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