2010-01-13 5 views
3

У меня есть проблема с компиляцией следующий код:Weird ошибка компиляции в Visual Studio 2008

#include <stdio.h> 
#include <limits.h> 
int main() { 
    printf("short: [%d,%d]\n",SHRT_MIN,SHRT_MAX); 
    printf("int: [%d, %d]\n",INT_MIN, INT_MAX); 
    printf("long: [%d, %d]\n",LONG_MIN,LONG_MAX); 
    int aa=017; 
    printf("%d\n",aa); 
    return 0; 
} 

сообщение об ошибке:

1>c:\tic\ex1\ex2\ex2.c(12) : error C2143: syntax error : missing ';' before 'type' 
1>c:\tic\ex1\ex2\ex2.c(13) : error C2065: 'aa' : undeclared identifier 

Однако сборник для этого нормально:

#include <stdio.h> 
    #include <limits.h> 
    int main() { 
     int aa=017; 
     printf("short: [%d,%d]\n",SHRT_MIN,SHRT_MAX); 
     printf("int: [%d, %d]\n",INT_MIN, INT_MAX); 
     printf("long: [%d, %d]\n",LONG_MIN,LONG_MAX); 
     printf("%d\n",aa); 
     return 0; 
    } 

Подумайте, в чем проблема?

ответ

10

В C переменные, которые ранее должны были быть объявлены в верхней части области действия, перед выполнением любого кода. Это не относится к C99 (что Visual Studio не реализует.)

+0

Я не уверен, что это ограничение было удалено раньше, чем C99. – GManNickG

+0

C89 (aka C90) требует, чтобы объявления отображались в верхней части блока, но не обязательно работали. Многие компиляторы поддерживают объявления где-либо в качестве расширения, но это определенно не C90. –

+0

Если вы скажете компилятору VC++ скомпилировать код C (а не C++), он по умолчанию будет иметь архаичный профиль C (возможно, старше C89). Просто дайте компилятору компилировать C++, если вы хотите обрезать сгенерированные кодом ключи компилятора use - например, отключение механизма исключения и т. Д. –

3

Visual Studio не поддерживает C99, поэтому все объявления (например, для aa в вашем примере) в блоке должны отображаться перед любыми утверждениями (например, ваши звонки printf).

1

В (старом) C вы не можете объявить переменную где угодно, как можете, на C++ или в последних стандартах C. Вы должны объявить его сразу после открытой фигурной скобки области, как в вашем втором примере.

0

изменить тип файла CPP, то он будет работать (и вы можете добавить C++ в вашем резюме)

+0

Я уверен, что люди не могут добавлять языки в резюме, переименовывая файлы.:) – GManNickG

+0

Я просто пытаюсь уйти ретро – segfault

+0

есть еще что на самом деле, измените stdio на cstdio, добавьте using namespace std; но в любом случае, я просто изучаю C для удовольствия. – segfault

0

Если вы явно не сказать ему, чтобы собрать как С, Безразлично, т Visual Studio скомпилировать .c файлы как C++ все равно ? Вы можете, конечно, использовать // commnets

1

В "классическом" языке C (C89/90) объявления не могут появляться в середине кода. Ваше первоначальное объявление aa будет действительным в C++ или в «новом» C (C99), но не в C89/90.

VS 2008 поставляется с компилятором C89/90, поэтому вы получаете эти ошибки.

Кроме того, правильный формат printf спецификатор для Priting long значений %ld, не %d.

1

В C до C99 все переменные в заданной области должны быть определены перед другими операциями в этой области. Хотя это изначально выглядит одинаково, это не довольно так же, как ответ GMan. В частности, функция может содержать другие блоки, которые определяют другие цели, и те могут определять переменные после исполняемых операторов в наружном блоке:

int main() { 
    int x; 

    printf("whatever"); 
    int y; // not allowed 

    { 
     int z; // allowed 
    } 
    return 0; 
} 

При определении блока, как это (который не связан с каким-либо контролем потока, как если оператор или цикл while) является довольно необычным, его является, разрешенным как часть C.

+0

вверх для интересного ответа – segfault

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