逸出#define宏#符号?
-
16-09-2019 - |
题
无需进入血淋淋的细节我想用一个#define
宏将扩大到#include
但“#”号是混淆预处理器(因为它认为我想引用一个参数。)
例如,我想做的事情是这样的:
#define MACRO(name) #include "name##foo"
和因此使用它:
MACRO(Test)
这将扩大为:
#include "Testfoo"
在简陋的#号导致该预处理器BARF。 MinGW的给我以下错误:
'#' is not followed by a macro parameter
我想我需要逃跑的#号,但我不知道,如果这甚至有可能。
是,宏确实是邪恶的......
解决方案
据我记得你不能使用其他预处理器指令在定义。
其他提示
有是可以插入一个散列令牌到预处理令牌流。可以按如下方式做到这一点:
#define MACRO(hash, name) hash include name
MACRO(#,"hello")
-expands为:
# include "hello"
然而,标准明确地排除了这种线的用于预处理指令的存在的任何进一步的分析[cpp.rescan]:
将所得的完全宏取代预处理标记序列不被处理,即使它类似于一个预处理指令。
在问题没有实际上得到您的预处理器的输出#符号。
显然,你要预处理器重新分析您的文件,以应对新创建的#include指令作为宏扩展的一部分。它不工作的方式。如果某行以#开头,它是预处理器和解释的指令。如果某行不以#开始,它只是受预处理器转型,包括宏替换。这是一个一次每行测试。
MACRO(Test)
不与#启动。因此,它不被解释为一个预处理指令;代替它的受到宏替换规则。
这是因为,#有在宏使用时特殊的含义。
# 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)
您不能这样做。预处理器指令宏扩展之前被识别;如果宏扩展到东西,看起来像一个预处理指令,该指令将无法识别。你能做的最好的是创建为文件名的宏:
#define MACRO(name) "name##foo"
...
#include MACRO(Test)
此的可能的工作(它适用于不带参数定期#define
宏,但我还没有与参数测试宏的话)。
#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);
不隶属于 StackOverflow