为什么需要在Visual Studio 2010中将FILE指针声明为main()?

Jul*_*iao 5 c c89 visual-c++

我试图在Visual Studio 2010中编译一个简单的ansi C示例,并遇到此错误编译:

错误:patchC.c(5):错误C2275:'FILE':非法使用此类型作为表达式

PROGRAM1:

#include <stdio.h>

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

同一程序在gcc v4.5.2中编译时没有错误.

但是,如果我把"FILE*fp;" 从main()行开始,程序优雅地编译.

程序2:

#include <stdio.h>

FILE *fp;

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

我不明白为什么这种行为,任何人都可以回答?

Jam*_*lis 16

Visual C++编译器仅支持C90.在C90中,所有局部变量声明必须在任何语句之前的块的开头.所以,声明fpmain的需求来前printf:

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

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

C99和C++都允许声明与块中的其他语句混合.Visual C++编译器不支持C99.如果您将原始代码编译为C++文件(扩展名为.cpp),则会成功编译.