5

我刚刚开始使用 Visual Studio(我从 Dreamspark 获得了 VS 2012,而且不久之后我又开始使用 Windows)并且遇到了一些麻烦。

我的 Source Files 文件夹下有一个名为“main.c”的文件,如下所示:

#include <stdio.h>

typedef struct S_s S;
struct S_s {
    void* x;
};

int main(int argc, char** argv)
{
    int N;
    scanf("%d", &N);

    S* s;
    printf("%p", s);

    return 0;
}

当我尝试构建它时,它会给我以下错误消息:

Error   3   error C2065: 's' : undeclared identifier    c:\users\math4tots\documents\visual studio 2012\projects\algorithms\lecture1\main.c 13  1   Lecture1
Error   4   error C2065: 's' : undeclared identifier    c:\users\math4tots\documents\visual studio 2012\projects\algorithms\lecture1\main.c 14  1   Lecture1
Error   2   error C2275: 'S' : illegal use of this type as an expression    c:\users\math4tots\documents\visual studio 2012\projects\algorithms\lecture1\main.c 13  1   Lecture1

有趣的是,如果我注释掉该scanf行,它就可以构建得很好。

我确实在“Visual C++”选项下创建了一个“空项目”,所以我不确定 VS 是否将它编译为 C 或 C++ 程序。但是,我的印象是我的代码与 C/C++ 无关,以至于它应该在 C 或 C++ 中编译。

在保持程序语义的同时,我能做些什么来构建它?

4

2 回答 2

15

代码是合法的 C++ 和合法的 C99,但不是合法的 C89。C89 中的变量声明必须出现在块的开头,因此在 C89 中使用S* s;afterscanf("%d", &N); 是不行的。

于 2012-08-28T18:43:13.267 回答
5

没有尝试过,但旧的 C 规则(C99 之前)只允许在块的开头声明自动变量。因此,根据这些规则,干预scanf使声明S* s非法。注释掉scanf“修复”问题。这在 C++ 中一直是合法的。

于 2012-08-28T18:43:29.523 回答