2011-01-28 35 views
4

我想编写C++宏服用任意参数,如:C++微距文本操作

#define MANIP(...) \ 
//Implementation 

这样写

MANIP(m_a, m_b, m_c); 

扩展到

f(a, b, c); 
g("a", "b", "c"); 

这可能吗?

预先感谢您帮助我与这个看似奢侈的问题:)

+0

您想从“m_a”中删除“m”吗? – Nawaz 2011-01-28 19:41:21

+3

我想你会发现很难从宏参数中去掉前导m_。但宏和C++是他们是什么,我不愿意说“不可能”... – 2011-01-28 19:41:34

回答

6

我不相信会有一个简单的方法可以从m_aa。但是,字符串运算符#是标准C和C++的一部分。给定

#define STRING(x) #x 

然后STRING(m_a)

例如,将被转换到"m_a"

0

这不是真的有可能有预处理器(这是什么处理的#define语句,而不是C++编译器本身)将参数分解成多个部分。因此,如果您尝试从m_a中提取a,则无法执行此操作。相反,它会是更好地界定喜欢你的宏:

 
    #define MANIP(m, a, b, c) 

,并要求“M”是一个独立的输入。其次,您不能轻松地将非字符串输入转换为字符串输入。 IE,从a转换为“a”不容易实现。我是这样说的,因为我知道一些CPP(C-Pre-processor)可以做到这一点。但我不认为它是可移植的。

通常,当您尝试做复杂的事情时,您应该使用编程语言而不是CPP来编写

具体来说,在C++中,您可以使用模板来获得比CPP的#define语句更多的工作。

0

预处理器无法分割令牌。这意味着不可能从m_foo或(最近已被要求)foo"foo"生产foo

如果您可以使用可变宏(正如Matthieu M.指出的那样,这意味着C99或C++ 0x),Jens Gustedt的P99 library在这里会有所帮助。有宏可以使这更容易,但是让我们使不熟悉库的人可读,好吗?

简体案例:可以传递两个或三个参数。

#define MANIP2(a, b) \ 
    f(a, b)   \ 
    g(#a, #b) 

#define MANIP3(a, b, c) \ 
    f(a, b, c)   \ 
    g(#a, #b, #c) 

#define MANIP(...) \ 
    MANIP_(   \ 
     P99_PASTE2(MANIP, P99_NARG(__VA_ARGS__)), \ 
     __VA_ARGS__) \ 

#define MANIP_(MANIPMAC, ...) MANIPMAC(__VA_ARGS__) 

这说明了基本原理。在实践中,有一些foreach风格的宏(类似于Boost的)使它更容易编码(虽然,正如我所提到的,对于外行来说更难以阅读)。详细信息请参见P99 library documentation