在宏中,我可以使用 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/