为什么父母会阻止宏观替代?

时间:2014-04-11 20:51:06

标签: c++ stl

在研究windows min / max宏问题的解决方案时,我找到了一个我非常喜欢的答案,但我不明白为什么它有效。 C ++规范中是否有一些内容表明宏替换不会发生在parens中?如果是这样的话呢?这只是其他东西的副作用,还是那种以这种方式工作的语言?如果我使用额外的parens max宏不会导致问题:

(std::numeric_limits<int>::max)()

我正在大规模的MFC项目中工作,并且有一些Windows库使用这些宏,所以我不想使用#undef技巧。

我的另一个问题是这个。 .cpp文件中的#undef max只会影响它在其中使用的文件,还是会为其他编译单元取消定义max

1 个答案:

答案 0 :(得分:8)

类似函数的宏只有在下一个后面的东西是左括号时才会展开。当用括号包围名称时,名称后面的下一个是左括号,因此不会发生扩展。

来自C ++11§16.3[cpp.replace] / 10:

  

类似函数的宏名称的每个后续实例后跟一个作为下一个预处理标记引入了预定处理标记序列,该标记由定义中的替换列表替换(调用宏)。

要回答另一个问题,预处理在正常编译和链接之前进行,因此在实现文件中执行#undef只会影响该文件。在标头中,它会影响包含该标头的每个文件。