Visual Studio“非法使用此类型作为表达式”

时间:2012-08-28 18:36:11

标签: c visual-studio

我刚开始使用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 ++编译。

在保持程序语义的同时,我该怎么做才能构建它?

2 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:5)

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