我有时会故意省略宏观参数。例如,对于像这样的类似函数的宏
#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_)发布于 2011-10-06 20:26:00
如果我理解正确的话,从C99和C++0x(11)开始,允许使用空宏参数。
C99 6.10.3/4说:
...参数的数量(包括那些不包含预处理标记的参数)应等于参数的数量...
C++ N3290 16.3/4也有同样的说法,而C++03 16.3/10提到:
...任何参数都不包含预处理标记,其行为是未定义的。
我认为空参数出现在上面没有预处理标记的表示参数下。
同样,6.10.3在国际标准编程语言C版本5.10的基本原理中说:
C99的一个新特性:类似函数的宏调用现在也可能有空参数,也就是说,一个参数可能不包含预处理标记。
发布于 2011-10-06 20:03:50
是。相关位为16.3/11
由最外面的圆括号限定的预处理标记序列构成了类似函数的宏的参数列表。列表中的各个参数由逗号预处理标记分隔。
不要求单个参数只对应一个令牌。实际上,下面的部分清楚地说明了每个参数可以有多个标记:
在被替换之前,每个参数的预处理标记都被完全宏替换,就像它们形成预处理文件的其余部分一样
在您的例子中,一个参数恰好对应于零个令牌。这不会引起任何矛盾。
N1566对此进行了更改,以使C++11与C99保持一致。
https://stackoverflow.com/questions/7666344
复制相似问题