Есть несколько способов сделать это:
если вы имеете дело только со строковыми литералами, вы можете просто использовать просто строки - размещение одного строкового литерала за другим приводит к тому, что компилятор объединяет их.
если могут быть задействованы другие вещи, кроме строковых литералов (т. Е. Вы создаете новые идентификаторы из макросов), используйте оператор вставки токена препроцессора '##
". Возможно, вам также понадобится использовать Строковый оператор '#
', превращающий ваши макросы в буквальные строки.
Пример # 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
Но это не сработает, потому что оно работает только с аргументами макросов, а не с любым старым макросом.
При использовании операторов предварительной обработки token-paste ('##') или stringizing ('#') вы должны использовать дополнительный уровень косвенности, чтобы они правильно работали в *1032*. все дела.
Если вы этого не сделаете, а элементы, переданные оператору вставки токенов, сами являются макросами, вы получите результаты, которые, вероятно, не соответствуют вашим ожиданиям:
#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)