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

标签 c visual-c++ c89

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

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

程序 1:

#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() 中取出一行,程序可以正常编译。

程序 2:

#include <stdio.h>

FILE *fp;

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

我不明白为什么会有这种行为,有人能回答吗?

最佳答案

Visual C++ 编译器只支持 C90。在 C90 中,所有局部变量声明必须在 block 的开头,在任何语句之前。因此,main 中的fp 声明需要在printf 之前:

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

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

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

关于c - 为什么需要在 Visual Studio 2010 中将 FILE 指针声明为 main()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5877812/

相关文章:

java - 为什么 log(1000)/log(10) 与 log10(1000) 不同?

c - 为什么将 int(或任何)指针指向结构不会给出错误

visual-studio - 为什么在我的 32 位应用程序中使用 WIC 在 Windows 7 32 位中失败?

c++ - 包含 .cpp 文件和 .h 文件(cpp 中的内容相同)的区别?

c - 后置自增运算符能保证立即运行吗?

c - 当用 C89 和 C99 编译时,什么 C 程序在运行时表现不同?

c - 为什么这个 C for 循环不能正常工作?

c - 如何在C中设置整数的最低有效位

c++ - Visual C++ 2015 不会编译模板代码

计数在 OpenMP 中无法正常工作