繁体   English   中英

为什么这个C ++代码会编译?

[英]Why does this C++ code compile?

有人可以向我解释为什么以下代码编译? 它被编译器忽略了吗?

#include <stdio.h>
int main() {
    1234;
    return 0;
}

标准要求实施者允许陈述,即使没有明显效果。 这主要是因为通过宏和模板的魔力,它们出人意料地容易出人意料。

这段代码没有错。 这完全合法。 它没有做任何事情,但它完全合法。 您的编译器 - 使用正确的警告设置 - 可能会警告您它完全没用,但它完全符合要求。

一个好的编译器会给你一个警告,你有一个没有副作用的语句a(有效的null语句),但是在C / C ++中允许使用null语句,所以不会有编译错误。

你可以想到声明1234; 与语句getc();类似getc(); 因为这两个语句都“返回”(评估为)一个值,但返回值没有任何结果。 getc()调用具有从标准输入中消耗字符的副作用,因此您更有可能在程序中看到它而不是裸数。 但两者都是合法的。

DeadMG很好地说明为什么允许这样做是个好主意。 这不是因为1234可能被定义为一个宏(因为据我所知,这是不允许的)。 这是因为,特别是对于更复杂的宏,很容易得到一个宏,可能会减少一些不做任何事情的语句。

在C(以及C ++)中, 表达式是一个语句 ,即使结果被丢弃,也会对其副作用进行求值。 如果它没有任何副作用,编译器可能会发现并优化它(很可能在你的情况下),但它仍然必须编译代码。

当然,如果没有明确禁用该警告,任何编译器都会发出警告。

打开警告。
将警告设置为错误(通常是这样)。

现在它会像你期望的那样表现:

> cat t.cpp
int main() {
    1234;
    return 0;
}
> g++ t.cpp -Wall -Wextra -pedantic -Werror
cc1plus: warnings being treated as errors
t.cpp: In function ‘int main()’:
t.cpp:2: warning: statement has no effect

它只是默认的编译器设置是松散的

因为1234是一个常数,它可以让你逃脱它。 用'x'替换它(不声明变量x)或'This not not compile'应该导致它失败。

基本上它是一个空的陈述,所以没有任何伤害没有犯规,它丢弃代码并继续前进。

暂无
暂无

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

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