#define DECLARE_DELETE_PTR(type) \
void DeletePtr_##type(string &operand) \
{\
}\
C ++宏定义中##
的含义是什么?
跟随代码的区别是什么?
#define MAKE_STRINGS(VAR) #VAR
只有一个#,但前者是两个#
答案 0 :(得分:2)
它要求预编译器连接两个令牌。
#define DECLARE_DELETE_PTR(type) \
void DeletePtr_##type(string &operand) \
{\
}\
DECLARE_DELETE_PTR(int)
会给:
void DeletePtr_int(string &operand)
//^^^ the macro argument is int, so the precompiler replaces it here
{
}
实际上,在宏代码中,参数type
与命令的其余部分连接在一起。如果宏参数是int
,那么它只是一个简单的替代,给出了上述结果。请记住,因为它是一个预处理器指令,所以它完全在编译时发生。
如果您使用的是Linux,我建议您查看cpp
命令,以便更好地理解。
关于你的第二个问题,区别在于它只是两个不同的运算符。
顾名思义 - >它将其参数转换为c-string(我刚试过)。例如:
std::cout << MAKE_STRINGS(Hello World) << std::endl;
会变成:
std::cout << "Hello World" << std::endl
或者,更有趣的是:
std::cout << MAKE_STRINGS("Hello" World) << std::endl;
变为:
std::cout << "\"Hello\" World" << std::endl;
看起来它也会照顾逃避特殊角色,但我可能错了 - 这来自3分钟前的实验。
答案 1 :(得分:2)
它连接您通过参数type
...
DECLARE_DELETE_PTR(gremlin)
将扩展为:
void DeletePtr_gremlin(string &operand)
{
}
答案 2 :(得分:2)
##运算符用于连接两个标记。这是一个例子:
DECLARE_DELETE_PTR(MyType)
//将扩展为
void DeletePtr_MyType(string &operand)
{
}