有人可以向我解释为什么下面的代码可以编译吗?它会被编译器忽略吗?
#include <stdio.h>
int main() {
1234;
return 0;
}
该标准要求实施者允许声明,即使没有明显效果。这主要是因为通过宏和模板的魔力,它们非常容易想出。
这段代码没有任何问题。这是完全合法的。它没有做任何事情,但它是完全合法的。您的编译器(具有正确的警告设置)可能会警告您它完全没用,但它完全兼容。
一个好的编译器会警告你有一个没有副作用的语句(有效为空语句),但是 C/C++ 中允许使用空语句,因此不会出现编译错误。
您可以将语句
1234;
视为与语句 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)或“这无法编译”应该会导致它失败。
本质上它是一个空语句,所以没有坏处,没有犯规,它会丢弃代码并继续运行。