Конкатенация строки в C # включает имя файла - PullRequest
12 голосов
/ 01 февраля 2012

Возможно ли объединить строку из другого макроса при включении имени файла (в C).Например,

у меня есть,

#define AA 10 
#define BB 20

- это параметры, которые меняются при запуске программы

И файл включает в себя:

#include "file_10_20" // this changes correspondingly i.e. file_AA_BB

Isэто может иметь что-то вроде #include "file_AA_BB" как-нибудь?Я гуглил, обнаружив, что оператор двойного фунта может объединять строки, но не мог найти способ сделать это.

Любая помощь будет оценена.

Ответы [ 2 ]

17 голосов
/ 01 февраля 2012

Сначала я подумал «это легко», но потребовалось несколько попыток, чтобы выяснить:

#define AA 10 
#define BB 20

#define stringify(x) #x
#define FILE2(a, b) stringify(file_ ## a ## _ ## b)
#define FILE(a, b) FILE2(a, b)

#include FILE(AA, BB)

В соответствии с просьбой я постараюсь объяснить.FILE(AA, BB) расширяется до FILE2(AA, BB), но затем AA и BB расширяется до FILE2, поэтому следующее расширение - FILE2(10, 20), которое расширяется до stringify(file_10_20), который становится строкой.

Если вы пропуститеFILE2 вы получите stringify(file_AA_BB), который не будет работать.Стандарт C фактически тратит несколько страниц, определяющих, как выполняется расширение макроса.По моему опыту, лучший способ думать так: «если не было достаточно расширения, добавьте еще один слой define»

Только строго не будет работать, потому что # применяется до того, как AA заменяется на 10. Этокак обычно вы хотите, например:

#define debugint(x) warnx(#x " = %d", x)
debugint(AA);

напечатает

AA = 10
5 голосов
/ 01 февраля 2012

Обычно используется так:

#define stringify(x)  #x
#define expand_and_stringify(x) stringify(x)

#define AA 10
#define BB 20

#define TEXT1 "AA = " stringify(AA) " BB = " stringify(BB)
#define TEXT2 "AA = " expand_and_stringify(AA) " BB = " expand_and_stringify(BB)

TEXT1 = "AA = AA BB = BB"
TEXT2 = "AA = 10 BB = 20"

Это называется stringification .Вы должны проверить этот ответ .

...