2017-03-13 8 views
0

マクロ定義の最後にセミコロンを入れないのはなぜですか?マクロの定義構文

私は、プリプロセッサがコードのこれらの部分を処理することを知っています。これらの2つの間には関係がありますか?はいの場合、どのような種類ですか?

コンパイラと比較してプリプロセッサが処理する方法の違いとは関係がありますか?はいの場合、これらの違いは何ですか?

答えて

6

マクロ定義は、セミコロン;をそこに置いた場合を含め、まっすぐなテキスト置換に過ぎません。だから、

#define MYVAR 4; 

場合はthusly使用:

誤りである
for (i=0; i<4; ; i++) 

、それは構文エラーの原因となります

for (i=0; i<MYVAR ; i++) 

はに翻訳されるだろう。副作用がなくても機能するか動作するかのような瞬間にだまされることはありません。たとえば:動作しますが、仕事には良い方法ではありません

int j = 4;; 

int j = MYVAR; 

はに変換されます。 AntonH

#define MAX(a, b) (a > b ? a : b) 
int x = MAX(4, 5); 

によって与えられた例に加えて

+0

また、セミコロン(マクロブードゥー)のない 'int j = MYVAR'は悪いことです。それをしないでください。 – d3L

+0

私は参照してください。したがって、構文の欠陥を防ぎます。どうもありがとうございました。 – Leopold2

+0

@ d3lもし私がそれを見たら私の目はバグだろうと思う:) – AntonH

1

あなたはセミコロンでこのマクロを定義した場合、あなたは非常に奇妙に見えることになる、セミコロンなしで文を書くことができます:

#define MAX(a, b) (a > b ? a : b); 
int x = MAX(4, 5) 
1

プリプロセッサを忘れても、C言語には多くの場所があります。ここでは、最後に;を入れません。実際には、人は何かの終わりに;を置くことが;式文で終わる宣言で;ジャンプ文エンドで終わるCのルールよりも例外よりであると主張することができます; - それはそれです。そして、ほとんどの場合、;が言語上の必要性によって必要とされるとき、正当な文法上の理由から必要とされます。

マクロ定義の最後に;が必要な理由は何ですか?私は何も見ません。それはおそらくそれがそこにない理由です。

0

前処理指令(#define#include#if#ifdef#ifndefなど)ないので、それらはセミコロンで終端されていません。代わりに、改行文字で終了します。あなたは、いくつかのソース行にまたがる前処理指令をしたい場合は、次のような改行文字をエスケープする必要がありそう:他の人と同様に

#define FOREACH(n, arg, func)  \ 
    for(size_t i = 0; i < (n); i++) \ 
    {         \ 
    (func)((arg), i);    \ 
    }         

が言った、マクロ展開はちょうどダムのテキスト置換であるので、あなたはにセミコロンを置く場合マクロ定義の最後は拡張の一部になります。これはほとんどあなたが望むものではありません。