C ++宏谜语:打印TYPE的名称

时间:2011-11-30 20:40:36

标签: c++

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

有办法吗?

3 个答案:

答案 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;
}