可能重复:
如何单引号宏中的参数?
它如何执行以下操作:
#define MACRO(X) ...
MACRO(a) // should give 'a'
我可能错过了一种更简单的方法,但是#define MACRO(X) ((#X)[0])
. #
字符串化X
然后选择[0]
第一个字符。
似乎它不能用 C 预处理器完成,至少gcc 文档直言不讳:
无法将宏参数转换为字符常量。
像这样:
#include <string>
std::string Macro(const std::string& s)
{
std::string ret = "'";
ret += s;
ret += "'";
return ret;
}
在发现元编程需要这个答案之前,我发布了这个答案。我不知道如何为元编程实现这一点,但元编程不是我的强项。
另外,至于我为什么首先有效地说“不要使用预处理器”,请阅读下面的评论。但简而言之,我相信几乎所有通常使用预处理器完成的事情都可以而且应该使用第一级构造来完成。使用预处理器绕过 C++ 类型系统并降低安全性。宏难以调试,难以扩展。大量使用宏将导致没有创建宏的程序员不熟悉的代码,从而导致一种只有一个人知道的“秘密语言”,不仅降低了宏的可维护性,还降低了它们所在的函数的可维护性被使用。
好的,我想这不是那么短,但它确实存在。