【发布时间】:2010-11-30 19:30:08
【问题描述】:
它如何做到以下几点:
#define MACRO(X) ...
MACRO(a) // should give 'a'
【问题讨论】:
标签: c-preprocessor stringification
它如何做到以下几点:
#define MACRO(X) ...
MACRO(a) // should give 'a'
【问题讨论】:
标签: c-preprocessor stringification
我可能错过了一个更简单的方法,但是#define MACRO(X) ((#X)[0]) 怎么样。 # 对X 进行字符串化,然后[0] 选择第一个字符。
【讨论】:
似乎不能用 C 预处理器完成,至少gcc docs 直言不讳:
没有办法转换宏 参数转换为字符常量。
【讨论】:
像这样:
#include <string>
std::string Macro(const std::string& s)
{
std::string ret = "'";
ret += s;
ret += "'";
return ret;
}
在发现元编程需要这个答案之前,我发布了这个答案。我不知道如何为元编程实现这一点,但元编程不是我的专长。
另外,至于我为什么首先有效地说“不要使用预处理器”,请阅读下面的 cmets。但简而言之,我相信几乎所有通常使用预处理器完成的事情都可以而且应该使用第一级构造来完成。使用预处理器绕过 C++ 类型系统并降低安全性。宏难以调试,难以扩展。大量使用宏将导致没有创建宏的程序员不熟悉的代码,从而导致一种只有一个人知道的“秘密语言”,不仅降低了宏的可维护性,还降低了它们所在的函数的可维护性被使用了。
好的,我想这不是那么短,但确实如此。
【讨论】:
MACRO 的地方拨打Macro 的电话,它甚至不会构建。这就像试图用std::string sum(std::string a, std::string b) {return a + "+" + b;}替换#define SUM(a, b) (a)+(b)