C / C ++预处理器单引号?

时间:2010-11-30 19:30:08

标签: c-preprocessor stringification

  

可能重复:
  How to single-quote an argument in a macro?

如何执行以下操作:

#define MACRO(X) ...
MACRO(a) // should give 'a'

3 个答案:

答案 0 :(得分:5)

我可能错过了一种更简单的方法,但#define MACRO(X) ((#X)[0])怎么样? #字符串X然后[0]选择第一个字符。

答案 1 :(得分:2)

似乎用C预处理器无法完成,至少gcc doc直截了当地说明了这一点:

  

无法转换宏   参数变为一个字符常量。

答案 2 :(得分:-3)

像这样:

#include <string>

std::string Macro(const std::string& s)
{
  std::string ret = "'";
  ret += s;
  ret += "'";
  return ret;
}

编辑:

我在发现这是元编程所需要的之前发布了这个答案。我不知道如何通过元编程实现这一目标,但元编程不是我的专长。

另外,至于为什么我有效地说“不要使用预处理器”,请阅读下面的注释。但简而言之,我相信几乎所有通常使用预处理器完成的事情都可以而且应该使用第一级构造来完成。使用预处理器可以绕过C ++类型系统并降低安全性。宏很难调试,难以扩展。广泛使用宏将导致代码对于没有创建宏的程序员来说是不熟悉的,导致只有1个人知道的一种“秘密语言”,不仅降低了宏的可维护性,而且降低了它们的功能。使用。

好吧,我想这不是那么短暂,但确实如此。