簡単に言えば、私の 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