Сначала я подумал «это легко», но потребовалось несколько попыток, чтобы выяснить:
#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