【发布时间】:2011-12-01 18:06:02
【问题描述】:
我有时会故意省略宏参数。例如,对于类似函数的宏,如
#define MY_MACRO(A, B, C) ...
我可以这样称呼它:
MY_MACRO(, bar, baz)
技术上仍有 3 个参数;只是第一个是“空的”。这个问题与可变参数宏无关。
当我这样做时,我会在使用 -ansi(又名 -std=c++98)进行编译时收到来自 g++ 的警告,但在我使用 -std=c++0x 时不会收到警告。这是否意味着空宏参数在新的 C++ 标准中是合法的?
这就是我的全部问题,但期待“你为什么要这样做?”回应,这是一个例子。我喜欢保持 .h 文件不受函数体的干扰,但是在 .h 文件之外实现简单的访问器是乏味的。因此,我编写了以下宏:
#define IMPLEMENT_ACCESSORS(TEMPLATE_DECL, RETURN_TYPE, CLASS, FUNCTION, MEMBER) \
TEMPLATE_DECL \
inline RETURN_TYPE* CLASS::Mutable##FUNCTION() { \
return &MEMBER; \
} \
\
TEMPLATE_DECL \
inline const RETURN_TYPE& CLASS::FUNCTION() const { \
return MEMBER; \
}
这就是我将如何将它用于包含名为 int_ 的 int 的类模板:
IMPLEMENT_ACCESSORS(template<typename T>, int, MyTemplate<T>, Int, int_)
对于非模板类,我不需要template<typename T>,所以我省略了那个宏参数:
IMPLEMENT_ACCESORS(, int, MyClass, Int, int_)
【问题讨论】:
-
为什么不简单有两个同名的不同宏。少取一论
-
@parapura rajkumar:同样的原因,你不希望两个函数做同样的事情。如果一段代码被重复比维护它变得更难。任何修复都必须应用于每个副本。
-
FWIW 在使用空参数扩展宏时,即使使用
-Wall -Wextra -pedantic -ansi,我也没有收到任何关于 gcc 或 g++ 的警告。您收到的确切警告是什么? -
@parapura:因为宏不可重载,所以只能有一个具有特定名称的宏。
-
SuperElectric, R. Martinho:我编辑了这个问题以反映 C++11 已经正式发布的事实。