преобразовать цифру в строку в макрос

Возможный дубликат:
Преобразование токена препроцессора в строку

#define num 1234 

Я хочу определить «const char *» на основе num, в образце это будет:

 #define num_str "1234" 

Могу ли я написать макрокоманду для достижения этого? Примечание: 1234 будет изменено.

Благодарю.

Да, вы можете, но макрозамена может выглядеть немного странно. Замена двойного макроса существует по какой-то причине, и если вы подумаете об этом некоторое время, станет ясно, почему это необходимо.

 #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; } 

Выполнение этого:

 1234 

Причина двойной замены: на первый взгляд можно подумать, что это решит проблему:

 #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; } 

Но это дает:

 NUM 

это не то, что мы пытаемся сделать. Если вы хотите, чтобы фактическое расширение NUM-макроса было первым, то это то, что вам нужно сделать: принудительное расширение. Заставляя препроцессор заменять сначала через промежуточное расширение (как я покажу в верхней части этого ответа), макрос переданных сначала расширяется, а затем строит.

Side Bar: Этот метод особенно полезен для создания широкоформатных версий предопределенных макропроцессоров, которые в противном случае сохраняют регулярные строки. Например, макрос __FILE__ . Предположим, вам нужна широкоформатная версия этого файла (строка, добавленная в «L»). Сначала вы можете подумать, что это сработает:

 #define WIDESTR(str) L##str 

но расширяя это с помощью __FILE__ как в:

 const wchar *p = WIDESTR(__FILE__); 

приведет к ошибке компилятора: "Undefined identifier: L__FILE__"

Итак, как мы можем это решить? Точно так же мы и выше.

 #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; } 

В моей системе это производит:

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

В заключение...

В качестве утешительного приза мы объединяем все в этом ответе в одну гигантскую кукурузу, что, как мы полагаем, происходит, когда мы делаем это :

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

Как строка будет использоваться в остальной части вашего кода? Должен ли он быть строковым макросом? Стандартный способ создания строк из других значений – использование sprintf () из string.h

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