繁体   English   中英

VS2013 C99 —为什么要编译?

[英]VS2013 C99 — Why Does This Compile?

有人可以告诉我为什么下面的代码编译(请参见下面的getchar)吗? 我已经有一段时间没有写C了,但是我很确定getchar行不应该编译它。 刚刚安装了以/ Za + / Wall作为C编译的VS2013 Pro。正在寻找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;
}

这个:

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。

我确定您为此收到了编译器警告。 但这是编译的,因为您正在做的就是将c设置为函数getchar的地址(当然,您只会得到该地址的最低字节)。

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

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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM