-1

簡単に言えば、私の C++ の知識 (または不足) では、FOO は、これが定義されたときに括弧内にあるものに置き換えられます。しかし、括弧が空の場合はどうなりますか? 0に相当しますか?つまり、 aは?#ifdef foo (0)と同じことを行います。#ifdef foo ( )同等の場合、空の括弧で使用するのに役立つ効果はありますか?

4

3 に答える 3

2

マクロ展開は、マクロが展開されたものに展開されます。

#include <stdio.h>

#define L (
#define R )
#define l {
#define r }
#define LR ()

int main LR
l 
   printf L "Hello, World\n" R;
   return 0;
r

は完全に問題なくコンパイルされます (ヘッダー ファイルに L/R/l/r マクロを隠した場合、何を行ったか誰も理解できません。マクロが実際に展開されるようにするには、少なくともいくつかの場所にスペースが必要であることに注意してください。

この文

 #ifdef CRAPFOO ()

きれいにコンパイルされません (gcc の「#ifdef の末尾にある余分なトークン」、他のコンパイラでは他のエラーが発生する可能性があります。

 #define CRAPFOO ()
 #ifdef CRAPFOO
    do something
 #else
    not something
 #endif 

do something結果として出ます。

于 2013-04-30T09:53:39.127 に答える
2

#define絶対にばかげたテキストの置き換えです。そう:

#define FOO ()

int main()
{
    FOO;
}

になる

int main()
{
    ();
}

-Eオプションを使用してこれをテストできますg++(私もそう思いclangます)。これは、「前処理を行うだけ」、または同等にcpp、c プリプロセッサであるツールを実行することを意味します。すなわち

$ echo -e "#define FOO ()\nint main()\n{\n    FOO;\n}" > def.cpp ; g++ -E def.cpp 
# 1 "def.cpp"
# 1 "<command-line>"
# 1 "def.cpp"

int main()
{
    ();
}

(これらは Linux/その他の Unix コマンド ライン ツールです)。

于 2013-04-30T09:49:32.613 に答える
0

#defineはプリプロセッサ ディレクティブであり、コードを実際にコンパイルするに発生する愚かなテキスト置換ルールです。マクロ定義を適用するときのコード モデルはまだありません。

#define FOO ()

のすべての出現箇所を に置き換えFOOます()

#define FOO (0)

のすべての出現箇所を に置き換えFOOます(0)

#define FOO 0

のすべての出現を に置き換えますがFOO0これはと同じではありません(0)(これが違いを生む場合があります)。

でも、

#define FOO()

何も置き換えFOO()ない、触れないFOO

于 2013-04-30T09:51:10.977 に答える