在#definemacros中转义#符号?

没有进入血淋淋的细节,我想使用一个#definemacros,将扩大到#include但'#'符号混淆预处理器(因为它认为我想引用一个参数)。

例如,我想要做这样的事情:

 #define MACRO(name) #include "name##foo" 

然后使用它:

 MACRO(Test) 

这将扩大到:

 #include "Testfoo" 

谦虚的#符号导致预处理器barf。 MinGW给我以下错误:

'#' is not followed by a macro parameter

我想我需要逃避#的标志,但我不这样做,如果这是可能的。

是的,macros确实是邪恶的

据我记得你不能在定义中使用另一个预处理指令。

可以将哈希令牌插入预处理的令牌stream中。 你可以这样做:

 #define MACRO(hash, name) hash include name MACRO(#,"hello") 

扩展到:

 # include "hello" 

但是 ,该标准明确排除了对预处理指令[cpp.rescan]存在的这种线的进一步分析:

所得到的完全macrosreplace的预处理令牌序列不被处理为预处理指令,即使它类似于一个。

问题实际上并没有在预处理程序的输出中获得#符号。

显然你希望预处理器重新分析你的文件,以处理新创build的#include指令作为macros扩展的一部分。 这种方式不行。 如果一行以#开头,则是预处理程序的指令和解释。 如果一行不是以#开头的话,那么只能进行包括macrosreplace在内的预处理器转换。 这是一个一次一行的testing。

 MACRO(Test) 

不以#开头。 因此它不被解释为预处理器指令; 取而代之的是macros观替代规则。

这是因为#在macros中使用时有特殊含义。

 # means quote the following token (which should be a macro parameter name) ## means concatenate the preceding and following tokens. 

在你的情况下#没有一个正确的标记。 所以在你的情况下,我们需要经历一个间接的层面:

 #define QUOTE(name) #name #define TEST(name) QUOTE(name ## foo) #include TEST(scot) 

你不能这样做。 预处理器指令在macros扩展之前被识别; 如果macros扩展成看起来像预处理器指令的东西,那么该指令将不被识别。 你可以做的最好的是为文件名创build一个macros:

 #define MACRO(name) "name##foo" ... #include MACRO(Test) 

可能工作(它适用于没有参数的常规#定义macros,但我没有用参数的macrostesting它)。

 #define MACRO(name) <name##foo> #include MACRO(Test) 
 #define HASH_SIGN # BOOST_PP_CAT(HASH_SIGN, include) 
 #define PARAM_NAME Param #define GETNAME_(a) #a #define GETNAME(a) GETNAME_(a) int Param; printf("%s = %i\n", GETNAME(PARAM_NAME), PARAM_NAME);