在#definemacros中转义#符号?
没有进入血淋淋的细节,我想使用一个#define
macros,将扩大到#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);