2
#define NAME VALUE 

コンパイラがこれを確認すると、NAME が VALUE に置き換えられることはわかっています。しかし、次のような前処理ディレクティブの動作について混乱しています:

#define CONFIG_VAR(name, type, value) 

これはコンパイラに何かを置き換えるように指示するものではありませんが、次のようなステートメントを見ることができました

CONFIG_VAR(rank, int, 100)

これは正常にコンパイルされます。これはどのように作動しますか ?

4

5 に答える 5

2

あなたの例では、それはまったく何もしません。コンパイル エラーが発生するはずの引数であっても、すべての引数が受け入れられ、マクロ呼び出し全体が空の文字列に置き換えられます。

ただし、後で定義を次のように置き換えた場合:

#define CONFIG_VAR(name, type, value) add_config_var<type>(name, value)

それは突然何か役に立つでしょう。したがって、マクロは、プログラムのその部分で(まだ)実装されていないか、使用できない機能のプレースホルダーであると思います。

于 2013-04-17T16:04:43.253 に答える
1

これはマクロです (C++ よりも C でより一般的です)。あなたが提供した定義によると、プリプロセッサはその「関数」の出現を削除します。一般的なユースケースは、通常、ロギングです。

#ifdef DEBUG
#define dprintf(...) printf(...)
#else
#define dprintf(...)    // This will remove dprintf lines
#endif

C++ では、インライン関数を使用するのが一般的な慣習であると思います。インライン関数は、パフォーマンスに関して同じ値を提供しますが、型チェックも行われるからです。

于 2013-04-17T16:10:54.553 に答える
0

この場合、プリプロセッサは単にそのような文字列を削除します (何も置き換えません)。十分に広く使用されているテクニック。

これが重要な例を次に示します (実際には可能な使用法の 1 つにすぎません)。

#if DEBUG_ON
#define LOG(level, string) SomeLogger(level, string)
#else
#define LOG(level, string)
#endif

おそらく、 C プリプロセッサに慣れる必要があります。

定義されたアクションに基づいて繰り返しリストを処理するコードを作成する、やや近い手法 (X マクロ)があります。

于 2013-04-17T16:04:58.957 に答える
0

これが実際にマクロ定義全体である場合は、この関数のようなマクロを単に定義して何も展開しない(空の文字列) にします。たとえば、ソースでは、

CONFIG_VAR(rank, int, 100);

に変換されます

;
于 2013-04-17T16:05:14.520 に答える