Странная ошибка компиляции в Visual Studio 2008 - PullRequest
3 голосов
/ 14 января 2010

У меня проблема с компиляцией следующего кода:

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

Есть идеи, в чем проблема?

Ответы [ 7 ]

10 голосов
/ 14 января 2010

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

3 голосов
/ 14 января 2010

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

1 голос
/ 14 января 2010

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

int main() { 
    int x;

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

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

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

1 голос
/ 14 января 2010

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

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

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

1 голос
/ 14 января 2010

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

0 голосов
/ 14 января 2010

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

0 голосов
/ 14 января 2010

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

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