为什么这段代码无法编译?

3

能否有人解释一下为什么这段代码可以编译:

#include <stdio.h>
#include <string.h>

int main (int argc, char *argv [])
{
    FILE *ptr;

    char string[10] = "Testing";

    ptr = fopen("C:\\Users\\Jordan\\Desktop\\Hello.txt", "wb");

    fwrite(string,sizeof(string[0]), sizeof(string)/sizeof(string[0]), ptr);
}

然而这并不行:报错 C2065:'string' : 未声明的标识符

#include <stdio.h>
#include <string.h>


int main (int argc, char *argv [])
{
    FILE *ptr;

    ptr = fopen("C:\\Users\\Jordan\\Desktop\\Hello.txt", "wb");

    char string[10] = "Testing";

    fwrite(string,sizeof(string[0]), sizeof(string)/sizeof(string[0]), ptr);

}

我正在一台Windows 7的机器上使用Visual Studio 2010。
谢谢。

@DavidHeffernan - 是的,当我编译和运行前面的代码时它可以工作。但是当我尝试编译后面的版本(在打开文件之后声明我的字符串)时,它会给我这个错误。错误3 错误C2065:“string”:未声明的标识符 - Jordan
1
是的,其他人都有它。可恶的 MS C89!如果你想写 C 而不是 C++,那么你应该找一个更好的编译器。 - David Heffernan
1
我喜欢stringstring.h把我搞糊涂了(也可能是其他人)。 - Mysticial
遗憾的是,这在不久的将来可能不会改变:https://dev59.com/enVC5IYBdhLWcg3w51vy - Adam Rosenfield
3个回答

8

Visual Studio使用旧版C89/90 C语言。在这个较旧的C版本中,你不能混合声明和代码。

所有的声明必须放在顶部。这就是为什么第二个示例编译失败的原因。

//  This a declaration
FILE *ptr;

//  This is code
ptr = fopen("C:\\Users\\Jordan\\Desktop\\Hello.txt", "wb");

//  This is another declaration. Not Allowed in C89/C90!!!
char string[10] = "Testing";

1
我相信微软已经明确表示过, Visual Studio 永远不会支持C89以外的任何东西。 - John Bode
谢谢! 我觉得可能是这样的,难以置信! 回到Eclipse... - Jordan
我不认为他们明确地表达过,但根据他们对于支持C99的请求所做出的回应,他们肯定已经多次暗示过了。 - Mysticial
@JohnBode:他们在哪里说的?他们曾经参与过C1X的讨论。 - Fred Foo
@larsmans:请参考https://dev59.com/enVC5IYBdhLWcg3w51vy获取一些引用。 - Adam Rosenfield

3
在C语言(C89版本)中,所有变量必须在块的顶部(在这种情况下是函数)声明。在您的第一个示例中,您做到了这一点,在第二个示例中没有这样做。

2
如果您将这个文件保存为.c扩展名,编译器将把它解释为C源文件,因为VC++对C的支持是C89,所以C89规则适用于变量声明;特别是在C89中,您必须在块的开头声明所有本地变量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接