【问题标题】:What's the meaning of ## in the define code in C++ [duplicate]C ++中定义代码中的##是什么意思[重复]
【发布时间】:2013-05-07 02:04:04
【问题描述】:
#define DECLARE_DELETE_PTR(type) \
void DeletePtr_##type(string &operand) \
{\
}\

C++宏定义中##是什么意思?

跟后面的代码有什么区别?

#define MAKE_STRINGS(VAR) #VAR

只有一个#,但前者是两个#

【问题讨论】:

标签: c++ c-preprocessor


【解决方案1】:

它要求预编译器连接两个标记。

#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 字符串(我刚刚尝试过)。例如:

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 分钟前的实验。

【讨论】:

  • 不是字符串 - 令牌。规则实际上相当严格。
  • 是的 - 这可能会令人困惑。我会替换它,谢谢。
  • 跟后面的代码有什么区别? #define MAKE_STRINGS(VAR) #VAR只有一个#,但前者是两个#
  • 单哈希运算符将后面的宏参数转换为字符串——字符串化。与令牌串联完全不同。
【解决方案2】:

它连接你通过参数type传递的值...

DECLARE_DELETE_PTR(gremlin)

将扩展为:

void DeletePtr_gremlin(string &operand)
{
}

【讨论】:

  • 跟后面的代码有什么区别? #define MAKE_STRINGS(VAR) #VAR只有一个#,但前者是两个#
  • 单个散列会执行 stringification (它获取您的值并将其括在双引号中)。双散列进行替换。因此,MAKE_STRINGS(gremlin) 将扩展为 "gremlin"
  • @Paddy: 不——双哈希会进行令牌连接,因此(例如)x##y 被粘贴在一起成为单个令牌,xy
【解决方案3】:

## 运算符用于连接两个标记。这是一个例子:

DECLARE_DELETE_PTR(MyType) 

// 将扩展为

void DeletePtr_MyType(string &operand)
{
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2015-10-08
  • 2013-05-15
  • 2017-02-17
  • 2015-08-14
  • 2011-01-22
  • 2023-01-26
  • 1970-01-01
相关资源
最近更新 更多