Hay un par de maneras de hacer esto:
si usted está tratando con sólo literales de cadena, sólo tiene que usar, simplemente utilizar cadenas - colocando una cadena literal tras otro hace que el compilador concatenar .
si puede haber otras cosas que los literales de cadena implicadas (es decir., Que está creando nuevos identificadores de las macros) utilizar el "operador de preprocesador pegar token de ##
. Se podría, probablemente, también es necesario utilizar el '#
' 'operador stringizing para hacer sus macros en las cadenas literales
Un ejemplo de # 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
Y por lo que el operador va pegando símbolo, no creo que la mayor parte de la responde esa sugerencia El uso del operador del preprocesador de pegado de fichas lo ha intentado, puede ser difícil de usar.
Uso de la respuesta que se sugiere a menudo dará lugar a un error de compilación cuando intenta utilizar la macro IV_SECURE
, porque:
#define IV_SECURE "secure."##IV_DOMAIN
expande a:
"secure"domain.org
Es posible que desee probar utilizar el '
# `' 'stringizing' operador:
#define IV_SECURE "secure." #IV_DOMAIN
Pero tha t no funcionará porque solo funciona en macro argumentos, no solo en cualquier macro anterior.
Una cosa a tener en cuenta cuando está usando los operadores de preprocesamiento token-paste ('##') o stringizing ('#') es que debe usar un nivel adicional de direccionamiento indirecto para que funcionen correctamente en todos los casos.
Si no lo hace, y los artículos pasados al operador de red en pegar las macros son ellos mismos, obtendrá resultados que son probablemente no lo que quiere:
#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__)));
}
La salida:
buggy results:
SOME_MACRO__LINE__
BAD_PASTE(SOME_MACRO, __LINE__)
PASTE(SOME_MACRO, __LINE__)
desired result:
function_name21
Así, utilizando sus IV_DOMAIN
define originales y las macros UTILTY desde arriba, se puede hacer esto para conseguir lo que quiere:
// Sub-Domain
#define IV_SECURE "secure." STRINGIFY(IV_DOMAIN) //secure.domain.org etc
#define IV_MOBILE "m." STRINGIFY(IV_DOMAIN)
Posible duplicado de [Convertir un token de preprocesador en una cadena] (http://stackoverflow.com/questions/240353/convert-a-preprocessor -token-to-a-string) –