C++ 宏之谜 : Printing the name of the TYPE

标签 c++

在宏中,我可以使用 xxxx_##TYPE 和 ##TYPE##_xxxxx 来正确填写 TYPE 名称,但我不能在字符串中间使用 ##TYPE##,例如(打印“##TYPE## 是类型的名称”;)

有解决办法吗?

最佳答案

您可以通过结合两个特征来做到这一点。一种是“字符串化”,即通过在宏参数前加上 # 前缀将其转换为字符串。 (这与您显然已经熟悉的“标记粘贴”运算符 ## 相关但不同。)另一个事实是,当连续给定多个字符串文字时,C++ 会将它们组合起来成一个字符串。例如, "a" "b" "c" 等同于 "abc" 。我不清楚你的宏到底是如何定义的,所以我不能告诉你要输入什么确切,但是完整的解释和一些很好的工作示例在 http://gcc.gnu.org/onlinedocs/cpp/Stringification.html


编辑以添加一个简单的例子,应 Kleist 的要求。这个程序:

#include <stdio.h>

#define PRINT_WHAT_THE_NAME_OF_THE_TYPE_IS(TYPE) \
  printf("%s\n", "'" #TYPE "' is the name of the type.")

int main()
{
  PRINT_WHAT_THE_NAME_OF_THE_TYPE_IS(Mr. John Q. Type);

  return 0;
}

将打印这个:

'Mr. John Q. Type' is the name of the type.

(这将在 C 或 C++ 中运行。我用 C 语言编写它的原因是,根据我的经验,这些预处理器技巧在 C 代码中比在真正的 C++ 代码中更常见;但是如果你想使用 std::cout <<而不是 printf ,你绝对可以。)

关于C++ 宏之谜 : Printing the name of the TYPE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8332653/

相关文章:

c++ - C++ 类跟踪这个值!

c++ - 快速定位MSCV 2010中的错误信息

c++ - C++ 模板资源

c++ - 如何安全终止QT中不同线程上运行的对象

c++ - 非事件 #ifdef block 中的编译器错误

c++ - 在 C++ 中的错误条件下退出构造函数的最佳技术是什么

c++ - 分析多进程系统

c++ - 从对话框项中获取资源 ID

c++ - GNU Linker 找不到本地共享库

c++ - cURL 超时问题