Объявить локальные переменные C89 в начале области? - PullRequest
2 голосов
/ 01 марта 2012

Я пытался сделать это в ANSI C:

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;
}

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

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

Ответы [ 3 ]

3 голосов
/ 01 марта 2012

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 голосов
/ 01 марта 2012

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

Однако многие компиляторы "C89" допускаютВы должны размещать объявления переменных почти в любом месте блока, если компилятор не переведен в строгий режим.Это включает в себя GCC, который может быть переведен в строгий режим с помощью -pedantic.По умолчанию для Clang используется цель C99, поэтому -pedantic не повлияет на то, можете ли вы смешивать объявления переменных с кодом. * Боюсь, MSVC довольно слабо поддерживает C.Он поддерживает только C89 (старый!) С несколькими расширениями.

2 голосов
/ 01 марта 2012

Теперь я читал во многих местах, что вы должны объявлять переменные в начале блока кода, в котором существуют переменные. Это вообще верно для ANSI C 89?

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

(C90, 6.6.2 Составной оператор или блок)

Синтаксис

составной оператор

{объявление-list_opt Statement-list_opt}

Объявление должно быть до операторы в блоке.

C99 ослабил это, позволив смешивать объявления и операторы в блоке.В стандарте C99:

(C99, 6.8.2 Составной оператор)

Синтаксис

составной оператор :

{block-item-list_opt}

block-item-list:

block-item

block-список элементов блок-элемент

блок-элемент:

объявление

оператор

...