convertir digital a cadena en macro

Posible duplicado:
Convertir un token de preprocesador a una cadena

#define num 1234 

Quiero definir un “const char *” basado en num, en la muestra sería:

 #define num_str "1234" 

¿Puedo escribir una statement macro para lograr esto? NB: 1234 sería cambiado.

Gracias.

Sí, puedes, pero la sustitución de macros puede ser un poco extraña. La sustitución de doble macro está ahí por una razón, y si lo piensas por un tiempo, quedará claro por qué es necesario.

 #define STRINGIZER_(exp) #exp #define STRINGIZER(exp) STRINGIZER_(exp) #define NUM 1234 int main(int argc, char *argv[]) { const char *p = STRINGIZER(NUM); printf("%s\n",p); return EXIT_SUCCESS; } 

Ejecutando esto:

 1234 

La razón de la doble sustitución: a primera vista, uno puede pensar que esto resolverá el problema:

 #define STRINGIZER(exp) #exp #define NUM 1234 int main(int argc, char *argv[]) { const char *p = STRINGIZER(NUM); printf("%s\n",p); return EXIT_SUCCESS; } 

Pero esto produce:

 NUM 

que no es lo que estamos tratando de hacer. Si desea primero la expansión real de la macro NUM, entonces eso es lo que tiene que hacer: forzar la expansión. Al forzar al preprocesador a sustituir primero a través de una expansión intermedia (como se muestra en la parte superior de esta respuesta), la macro pasada se expande primero, luego se encadena.

Barra lateral: esta técnica es particularmente útil para generar versiones de caracteres amplios de macros preprocesadas predefinidas que de otra manera contienen cadenas normales. Por ejemplo, la macro __FILE__ . Supongamos que desea una versión amplia de este (una cadena con una ‘L’). Primero puede pensar que esto funcionará:

 #define WIDESTR(str) L##str 

pero expandiendo esto con __FILE__ como en:

 const wchar *p = WIDESTR(__FILE__); 

dará como resultado un error del comstackdor: "Undefined identifier: L__FILE__"

Entonces, ¿cómo podemos abordar esto? De la misma manera que hicimos arriba.

 #define WIDESTR_(str) L##str #define WIDESTR(str) WIDESTR_(str) int main(int argc, char *argv[]) { const wchar_t* p = WIDESTR(__FILE__); wcout << p << endl; return EXIT_SUCCESS; } 

En mi sistema, esto produce:

 /Users/craig/tmp/main/main/test.cpp 

Para concluir...

Como premio de consolación, combinamos todo en esta respuesta en una stack gigante de Goo, ¿qué suponemos que sucede cuando hacemos esto ?

 int main() { const wchar_t *p = WIDESTR(STRINGIZE(NUM)); wcout << p << endl; return EXIST_SUCCESS; } 

¿Cómo se utilizará la cadena en el rest de su código? ¿Tiene que ser una macro de cadena? La forma estándar de crear cadenas a partir de otros valores es usar sprintf () de string.h

 #define num 1234 sprintf(string,"%d",num);