为什么这段代码不能编译?

时间:2011-12-13 22:04:31

标签: c visual-studio-2010

有人可以解释为什么这段代码会编译:

#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。

由于

3 个答案:

答案 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中,您必须在其块的开头声明所有局部变量。