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

问题描述 投票:0回答:7

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

#include <stdio.h>
int main() {
    1234;
    return 0;
}
c++
7个回答
8
投票

该标准要求实施者允许声明,即使没有明显效果。这主要是因为通过宏和模板的魔力,它们非常容易想出。


5
投票

这段代码没有任何问题。这是完全合法的。它没有做任何事情,但它是完全合法的。您的编译器(具有正确的警告设置)可能会警告您它完全没用,但它完全兼容。


3
投票

一个好的编译器会警告你有一个没有副作用的语句(有效为空语句),但是 C/C++ 中允许使用空语句,因此不会出现编译错误。


3
投票

您可以将语句

1234;
视为与语句
getc();
类似,因为这两个语句都“返回”(求值)一个值,但不对返回值执行任何操作。 getc() 调用具有消耗标准输入中的字符的副作用,因此您更有可能在程序中看到它而不是裸露的数字。 但两者都是合法的。

DeadMG 有一个很好的注释说明了为什么允许这样做是个好主意。 这并不是因为

1234
可能被定义为宏(因为据我所知,这是不允许的)。 这是因为,尤其是对于更复杂的宏,很容易最终得到一个可能会简化为某些不执行任何操作的语句的宏。


3
投票

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

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


1
投票

打开警告。
将警告设置为像错误一样对待(通常如此)。

现在它将如您所期望的那样运行:

> 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

只是默认编译器设置不严


0
投票

因为 1234 是一个常数,所以你可以不用担心。 将其替换为“x”(不声明变量 x)或“这无法编译”应该会导致它失败。

本质上它是一个空语句,所以没有坏处,没有犯规,它会丢弃代码并继续运行。

© www.soinside.com 2019 - 2024. All rights reserved.