マクロに固執したい場合、これは何が起こっているのか、そしてそれをどのように改善できるのかについての簡単な説明です。
#define PREFIX "pre_"
#define KEYWORD "keyword"
前処理中にそれらの定義に置き換えられる2つのマクロを定義します。
#define BOTH PREFIX+KEYWORD
その後、に置き換えられます
"pre_"+"keyword"
結果としてポインタが追加されますが、明らかにあなたが望むものではありません。CおよびC++の場合と同様に、演算子を使用せずにパーツを並べて書き込むだけでC文字列を分割できます(2つのC文字列の連結ではなく、1つのC文字列リテラルとして扱われます)。
"pre_" "keyword"
したがって、マクロを
#define BOTH PREFIX KEYWORD
このようなプレフィックスがプログラムで頻繁に使用される場合は、次の方法をお勧めします。
#define PRE(x) "pre_" x
そして、マクロを「呼び出す」
PRE("keyword")
これはに展開され"pre_" "keyword"
ます。
これで、常にトークン"keyword"
として記述できる(特殊文字なしの)コンパイル時のC文字列である場合は、引用符なしで機能させることもできます。
#define PRE(x) "pre_" #x
はトークンをC文字列リテラルに#x
「変換」します。x
次に、次のように書くことができます。
PRE(keyword)
これはプリプロセッサによって行われるためkeyword
、C / C ++キーワードにすることもでき、のように引き続き有効であることに注意してくださいPRE(if)
。
完全を期すために:結果をトークンのままにしたい場合は、プリプロセッサ演算子を使用してトークンの連結を実行できます##
。
#define PRE(x) pre_ ## x
次に、PRE(keyword)
に展開しpre_keyword
ます。