Почему указатель FILE должен быть объявлен как main () в Visual Studio 2010? - PullRequest
5 голосов
/ 04 мая 2011

Я пытался скомпилировать простой пример ANSI C в Visual Studio 2010 и столкнулся с этой ошибкой компиляции:

Ошибка: patchC.c (5): ошибка C2275: «ФАЙЛ»: незаконное использование этого типа в качестве выражения

Program1:

#include <stdio.h>

int main(void) {
    printf("Hello world!\n");
    FILE *fp;
    fp = fopen("test.txt", "r");
    return 0;
}

Эта же программа без ошибок компилируется в gcc v4.5.2.

Но, если я поставлю "FILE * fp;" из строки main () программа изящно компилируется.

Program2:

#include <stdio.h>

FILE *fp;

int main(void) {
    printf("Hello world!\n");
    fp = fopen("test.txt", "r");
    return 0;
}

Я не понимаю, почему такое поведение, кто-нибудь может ответить?

1 Ответ

16 голосов
/ 04 мая 2011

Компилятор Visual C ++ поддерживает только C90.В C90 все объявления локальных переменных должны находиться в начале блока перед любыми операторами.Таким образом, объявление fp в main должно предшествовать printf:

int main(void) {
    // Declarations first:
    FILE *fp;

    // Then statements:
    printf("Hello world!\n");
    fp = fopen("test.txt", "r");
    return 0;
}

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

...