VS2013 C99 - 为什么编译?

时间:2014-11-27 00:19:33

标签: c

有人可以告诉我为什么以下代码编译(参见下面的getchar)?我有一段时间没写C,但我很确定getchar行不应该允许这个编译。刚安装的VS2013 Pro使用/ Za + / Wall编译为C.寻找C99合规性。

int count_lines(void) {
    char c;
    int num_of_lines = 0;

    while ((c = getchar) != EOF)      // compiles as getchar instead of getchar()
        if (c == '\n') ++num_of_lines;

    return num_of_lines;
}

3 个答案:

答案 0 :(得分:2)

此:

c = getchar

尝试将函数getchar的地址分配给char对象c

这是约束违规,这意味着任何符合要求的C编译器都必须发出诊断。该诊断可能在法律上是一个非致命的警告,并且仍然允许编译器生成“工作”可执行文件 - 尽管它的行为不是由标准定义的。

如果编译器没有完全拒绝它,它很可能会生成函数指针值到类型char的转换。该标准没有定义这种转换的行为(但它可能采用地址的低8位。这不太可能与EOF的值匹配,从而导致无限循环。)

我确定你知道,行

while ((c = getchar) != EOF)

应该是

while ((c = getchar()) != EOF)

正如您可能没有注意到的那样,getchar()函数返回类型为int的结果,而不是char,因此可以将值EOF与任何值区分开来有效的字符值。您应将c声明为int,而不是char。参见comp.lang.c FAQ的问题12.1。

答案 1 :(得分:1)

我确定你有一个编译器警告。但它编译是因为你正在做的是将c设置为函数getchar的地址(当然你只获得地址的最低字节)。

答案 2 :(得分:0)

您是否只是将c分配给getchar函数的地址值。这可能不是你想要的但不是非法的。

gcc -g -o test test.c
test.c: In function ‘count_lines’:
test.c:7:15: warning: assignment makes integer from pointer without a cast [enabled by   default]
     while ((c = getchar) != EOF)      // compiles as getchar instead of getchar()