Есть несколько способов сделать это:
если вы имеете дело только со строковыми литералами, вы можете просто использовать простые строки use - размещение одного строкового литерала за другим заставляет компилятор объединять их.
если могут быть задействованы другие вещи, кроме строковых литералов (т. е. вы создаете новые идентификаторы из макросов), используйте оператор вставки токена препроцессора «##
». ваши макросы в буквальные строки.
Пример №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
Возможно, вы захотите попробовать использовать оператор '
#`' 'stringing':
#define IV_SECURE "secure." #IV_DOMAIN
Но это не сработает, потому что работает только с аргументами макроса, а не только с любым старым макросом.
Одна вещь, о которой следует помнить, когда вы используете операторы препроцессора token-paste ('##') или строки ('#'), заключается в том, что вам нужно использовать дополнительный уровень косвенности, чтобы они работали правильно во всех случаях.
Если вы этого не сделаете и элементы, переданные оператору вставки токенов, сами по себе являются макросами, вы, вероятно, получите не то, что хотите:
#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)
person
Michael Burr
schedule
28.04.2009