恩赦は、この質問はナイーブである場合。次のプログラムを考えてみます。
#include <stdio.h>
int main() {
int i = 1;
i = i + 2;
5;
i;
printf("i: %d\n", i);
}
上記の例では、文5;
とi;
完全に余分に見える、まだデフォルトでは、警告やエラーのないコードのコンパイル(ただし、gccは投げないwarning: statement with no effect [-Wunused-value]
と警告するとき走ったが-Wall
)。彼らは、プログラムの残りの部分に影響を与えない、なぜ彼らが最初の場所で有効なステートメントを考えられていますか?コンパイラは、単にそれらを無視していますか?そのような発言を許可することにどんなメリットがありますか?
そのような発言を許可する1つの利点は、むしろ人間によって書かれているよりも、マクロやその他のプログラムによって作成されたのコードからです。
一例として、機能を想像 int do_stuff(void)
失敗の成功または-1に0を返すことになっています。それは「もの」のサポートはオプションであるということができ、あなたはないというヘッダファイルを持つことができますので、
#if STUFF_SUPPORTED
#define do_stuff() really_do_stuff()
#else
#define do_stuff() (-1)
#endif
今可能であればものをやりたいいくつかのコードを想像しますが、または実際にそれが成功したか失敗したかどうか気にしないかもしれないことがあります。
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();
}
ときSTUFF_SUPPORTED
0であり、プリプロセッサは、呼を拡大するfunc2
だけで読み込むステートメントに
(-1);
およびコンパイラのパスがお邪魔しているようだ「余分」文のちょうど並べ替えが表示されますので。しかし、一つは他に何ができるのでしょうか?あなたの場合は#define do_stuff() // nothing
、コードの中には、func1
破損します。(そして、あなたはまだで、空の文を持っていますfunc2
ちょうど読み取る;
おそらく多くの余分である。)一方、あなたが実際に定義する必要があればdo_stuff()
リターンが-1、あなたが関数呼び出しのコストが発生する場合があり、その関数を正当な理由なく。