如果这个问题很幼稚,请原谅。考虑以下程序:
#include <stdio.h>
int main() {
int i = 1;
i = i + 2;
5;
i;
printf("i: %d\n", i);
}
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,语句5;
andi;
似乎完全多余,但代码在默认情况下编译时没有警告或错误(但是,gccwarning: statement with no effect [-Wunused-value]
在运行时确实会抛出警告-Wall
)。它们对程序的其余部分没有影响,那么为什么它们首先被认为是有效的语句?编译器会简单地忽略它们吗?允许这样的陈述有什么好处吗?
Nat*_*dge 10
允许此类语句的一个好处是来自由宏或其他程序创建的代码,而不是由人类编写的。
例如,假设一个函数 int do_stuff(void)
应该在成功时返回 0 或在失败时返回 -1。可能是对“东西”的支持是可选的,所以你可以有一个头文件
#if STUFF_SUPPORTED
#define do_stuff() really_do_stuff()
#else
#define do_stuff() (-1)
#endif
Run Code Online (Sandbox Code Playgroud)
现在想象一下,如果可能的话,一些代码想要做一些事情,但可能会或可能不会真正关心它是成功还是失败:
void func1(void) {
if (do_stuff() == -1) {
printf("stuff did not work\n");
}
}
void func2(void) {
do_stuff(); // don't care if it works or not
more_stuff();
}
Run Code Online (Sandbox Code Playgroud)
当STUFF_SUPPORTED
为 0 时,预处理器会将调用扩展为func2
仅读取的语句
(-1);
Run Code Online (Sandbox Code Playgroud)
因此编译器传递只会看到似乎困扰您的那种“多余”的语句。然而,人们还能做什么呢?如果你#define do_stuff() // nothing
,那么代码func1
就会中断。(而且你仍然会有一个空语句,func2
它只是 read ;
,这可能是多余的。)另一方面,如果你必须实际定义一个do_stuff()
返回 -1的函数,你可能会产生函数调用的成本没有充分的理由。