1

専用のヘッダー ファイルで一連の定数を定義したいと考えています。

一部のプレフィックスは非常に頻繁に使用されるため、一度定義してから、必要に応じて追加したいと考えています。

私の質問は:

プレフィックスをスペースなしで別の文字列と連結するにはどうすればよいですか?

例:

#define PREFIX "pre_"
#define KEYWORD "keyword"
#define BOTH PREFIX+KEYWORD

両方の望ましい結果: pre_keyword

明らかに + で

BOTH PREFIX+KEYWORD

動作しないでしょう。では、これらのトークンをどのように連結できるのでしょうか?

4

2 に答える 2

6

ただ

#define BOTH PREFIX KEYWORD

それをするでしょう。

隣接するリテラルは自動的に連結されるため、

"pre_" "keyword" 

になるだろう

"pre_keyword"
于 2013-02-12T08:16:54.487 に答える
1

マクロに固執したい場合、これは何が起こっているのか、そしてそれをどのように改善できるのかについての簡単な説明です。

#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ます。

于 2013-02-12T08:37:25.027 に答える