有几种方法可以做到这一点:
如果您只处理字符串文字,您可以简单地使用简单的使用字符串 - 一个接一个地放置一个字符串文字会导致编译器连接它们。
如果可能涉及字符串文字以外的其他内容(即,您正在从宏创建新标识符),请使用 ' ##
" 预处理器标记粘贴运算符。您可能还需要使用 ' #
' 'stringizing 运算符来制作宏成文字字符串。
#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
但这不起作用,因为它只适用于宏参数 - 而不仅仅是任何旧的宏。
使用标记粘贴 ('##') 或字符串化 ('#') 预处理运算符时要注意的一件事是,您必须使用额外的间接级别才能使它们在所有情况下都能正常工作。
如果您不这样做并且传递给令牌粘贴运算符的项目本身就是宏,您将获得可能不是您想要的结果:
#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)