Search code examples
cvisual-c++c89

Why FILE pointer need to be declared out main() in Visual Studio 2010?


I was trying to compile a simple ansi C example in Visual Studio 2010 and came across with this error compiling:

Error: patchC.c(5): error C2275: 'FILE' : illegal use of this type as an expression

Program1:

#include <stdio.h>

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

The same program compiles without errors in gcc v4.5.2.

But, if I put the "FILE *fp;" line out of the main(), the program compile gracefully.

Program2:

#include <stdio.h>

FILE *fp;

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

I don't figure out why this behavior, anyone could answer?


Solution

  • The Visual C++ compiler only supports C90. In C90, all local variable declarations must be at the beginning of a block, before any statements. So, the declaration of fp in main needs to come before the printf:

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

    C99 and C++ both allow declarations to be intermixed with other statements in a block. The Visual C++ compiler does not support C99. If you compiled your original code as a C++ file (with a .cpp extension), it would compile successfully.