有人可以解释为什么这段代码会编译:
#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:&#39; string&#39; :未声明的标识符
#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。
由于
答案 0 :(得分: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 :(得分:3)
在(C89版本)C中,所有变量必须在块的顶部声明(在本例中为函数)。在你的第一个例子中,你正在这样做,在你的第二个例子中,你不是。
答案 2 :(得分:2)
如果您使用.c扩展名保存此文件,则编译器会将其解释为C源文件,并且由于C ++的VC ++支持适用于C89,因此适用于变量声明的C89规则;特别是在C89中,您必须在其块的开头声明所有局部变量。