在宏中,我可以使用xxxx _ ## TYPE和## TYPE ## _ xxxxx正确填写TYPE名称,但我不能在字符串中间使用## TYPE ##,例如(打印“## TYPE ##是类型的名称”;)
有办法吗?
答案 0 :(得分:6)
您可以通过组合两个功能来完成此操作。一个是''stringification'',其中宏参数通过在其前面添加#
来转换为字符串。 (这与您显然已经熟悉的''token-pasting''运算符##
有关但不同。)另一个是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-ishly的原因是,根据我的经验,这些类型的预处理器技巧在C代码中比在实际C ++代码中更常见;但是如果你想使用{ {1}}而不是std::cout <<
,你绝对可以。)
答案 1 :(得分:1)
##
是token pasting operator,它需要两个不同的令牌并将它们粘贴在一起以制作单个令牌。整个字符串文字被认为是单个标记,因此粘贴操作符不能在其中工作。见http://gcc.gnu.org/onlinedocs/gcc-4.0.4/cpp/Tokenization.html
答案 2 :(得分:0)
字符串文字在彼此相邻时会连接在一起。
#define QUOTE(X) #X
#define DOSTUFF(TYPE) \
void print_ ## TYPE () { \
static const char *str = QUOTE(TYPE) " is the name of the type\n"; \
printf(str); \
}
DOSTUFF(Foo);
int main(int argc, char ** argv) {
print_Foo();
return 0;
}
g++ -E -c main.cpp
的输出将显示预处理的内容。
# 16 "main.cpp"
void print_Foo () {
static const char *str = "Foo" " is the name of the type\n";
printf(str);
};
int main(int argc, char ** argv) {
print_Foo();
return 0;
}