首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C++11中,空宏参数合法吗?

在C++11中,空宏参数合法吗?
EN

Stack Overflow用户
提问于 2011-10-06 03:08:08
回答 2查看 11K关注 0票数 28

我有时会故意省略宏观参数。例如,对于像这样的类似函数的宏

代码语言:javascript
复制
#define MY_MACRO(A, B, C)  ...

我可以这样称呼它:

代码语言:javascript
复制
MY_MACRO(, bar, baz)

从技术上讲,仍然有3个参数;只是第一个是“空的”。这个问题不是关于可变的宏。

当我这样做时,当我使用-ansi (也就是-std=c++98)编译时,我会收到来自g++的警告,但当我使用-std=c++0x时就不会了。这是否意味着空宏参数在新的C++标准中是合法的?

这就是我的问题的全部,但预计会出现“你为什么要这样做?”响应,这里有一个例子。我喜欢让.h文件由函数体保持整洁,但是在.h文件之外实现简单的访问器是很乏味的。因此,我编写了以下宏:

代码语言:javascript
复制
#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的类模板

代码语言:javascript
复制
IMPLEMENT_ACCESSORS(template<typename T>, int, MyTemplate<T>, Int, int_)

对于非模板类,我不需要template<typename T>,所以我省略了宏参数:

代码语言:javascript
复制
IMPLEMENT_ACCESORS(, int, MyClass, Int, int_)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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的一个新特性:类似函数的宏调用现在也可能有空参数,也就是说,一个参数可能不包含预处理标记。

票数 14
EN

Stack Overflow用户

发布于 2011-10-06 20:03:50

是。相关位为16.3/11

由最外面的圆括号限定的预处理标记序列构成了类似函数的宏的参数列表。列表中的各个参数由逗号预处理标记分隔。

不要求单个参数只对应一个令牌。实际上,下面的部分清楚地说明了每个参数可以有多个标记:

在被替换之前,每个参数的预处理标记都被完全宏替换,就像它们形成预处理文件的其余部分一样

在您的例子中,一个参数恰好对应于零个令牌。这不会引起任何矛盾。

N1566对此进行了更改,以使C++11与C99保持一致。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7666344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档