簡単に言えば、私の C++ の知識 (または不足) では、FOO は、これが定義されたときに括弧内にあるものに置き換えられます。しかし、括弧が空の場合はどうなりますか? 0に相当しますか?つまり、 aは?#ifdef foo (0)と同じことを行います。#ifdef foo ( )同等の場合、空の括弧で使用するのに役立つ効果はありますか?
3 に答える
マクロ展開は、マクロが展開されたものに展開されます。
#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結果として出ます。
#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 コマンド ライン ツールです)。
#defineはプリプロセッサ ディレクティブであり、コードを実際にコンパイルする前に発生する愚かなテキスト置換ルールです。マクロ定義を適用するときのコード モデルはまだありません。
#define FOO ()
のすべての出現箇所を に置き換えFOOます()。
#define FOO (0)
のすべての出現箇所を に置き換えFOOます(0)。
#define FOO 0
のすべての出現を に置き換えますがFOO、0これはと同じではありません(0)(これが違いを生む場合があります)。
でも、
#define FOO()
何も置き換えFOO()ない、触れないFOO