これを行うには、いくつかの方法があります。
文字列リテラルのみを扱っている場合は、単純に文字列を使用するだけです。文字列リテラルを次々に配置すると、コンパイラはそれらを連結します。
文字列リテラル以外のものが関係している可能性がある場合 (つまり、マクロから新しい識別子を作成している場合)、' ##
" プリプロセッサ トークンの貼り付け演算子を使用し#
ます。マクロを作成するには、' ' ' 文字列化演算子も使用する必要があるでしょう。リテラル文字列に。
#1の例:
#ifdef __TESTING
#define IV_DOMAIN "domain.org" //in house testing
#elif __LIVE_TESTING
#define IV_DOMAIN "test.domain.com" //live testing servers
#else
#define IV_DOMAIN "domain.com" //production
#endif
// Sub-Domain
#define IV_SECURE "secure." IV_DOMAIN //secure.domain.org etc
#define IV_MOBILE "m." IV_DOMAIN
そして、トークン貼り付け演算子に関する限り、トークン貼り付けプリプロセッサ演算子の使用を提案した回答のほとんどが実際に試したとは思いません-使用するのは難しい場合があります。
IV_SECURE
よく提案される回答を使用すると、マクロを使用しようとしたときにコンパイラ エラーが発生します。理由は次のとおりです。
#define IV_SECURE "secure."##IV_DOMAIN
次のように展開されます。
"secure"domain.org
'
#`' 'stringizing' 演算子を使用してみてください:
#define IV_SECURE "secure." #IV_DOMAIN
しかし、古いマクロだけでなく、マクロ引数でのみ機能するため、それは機能しません。
トークンの貼り付け ('##') または文字列化 ('#') の前処理演算子を使用する場合に注意すべきことの 1 つは、それらがすべての場合に適切に機能するために、余分なレベルの間接化を使用する必要があることです。
これを行わず、トークン貼り付け演算子に渡されたアイテムがマクロ自体である場合、おそらく望んでいない結果が得られます。
#include <stdio.h>
#define STRINGIFY2( x) #x
#define STRINGIFY(x) STRINGIFY2(x)
#define PASTE2( a, b) a##b
#define PASTE( a, b) PASTE2( a, b)
#define BAD_PASTE(x,y) x##y
#define BAD_STRINGIFY(x) #x
#define SOME_MACRO function_name
int main()
{
printf( "buggy results:\n");
printf( "%s\n", STRINGIFY( BAD_PASTE( SOME_MACRO, __LINE__)));
printf( "%s\n", BAD_STRINGIFY( BAD_PASTE( SOME_MACRO, __LINE__)));
printf( "%s\n", BAD_STRINGIFY( PASTE( SOME_MACRO, __LINE__)));
printf( "\n" "desired result:\n");
printf( "%s\n", STRINGIFY( PASTE( SOME_MACRO, __LINE__)));
}
出力:
buggy results:
SOME_MACRO__LINE__
BAD_PASTE( SOME_MACRO, __LINE__)
PASTE( SOME_MACRO, __LINE__)
desired result:
function_name21
したがって、元のIV_DOMAIN
定義と上記のユーティリティ マクロを使用すると、これを実行して必要なものを取得できます。
// Sub-Domain
#define IV_SECURE "secure." STRINGIFY( IV_DOMAIN) //secure.domain.org etc
#define IV_MOBILE "m." STRINGIFY( IV_DOMAIN)