在研究windows min
/ max
宏问题的解决方案时,我找到了一个我非常喜欢的答案,但我不明白为什么它有效。 C ++规范中是否有一些内容表明宏替换不会发生在parens中?如果是这样的话呢?这只是其他东西的副作用,还是那种以这种方式工作的语言?如果我使用额外的parens max
宏不会导致问题:
(std::numeric_limits<int>::max)()
我正在大规模的MFC项目中工作,并且有一些Windows库使用这些宏,所以我不想使用#undef
技巧。
我的另一个问题是这个。 .cpp文件中的#undef max
只会影响它在其中使用的文件,还是会为其他编译单元取消定义max
?
答案 0 :(得分:8)
类似函数的宏只有在下一个后面的东西是左括号时才会展开。当用括号包围名称时,名称后面的下一个是左括号,因此不会发生扩展。
来自C ++11§16.3[cpp.replace] / 10:
类似函数的宏名称的每个后续实例后跟一个(作为下一个预处理标记引入了预定处理标记序列,该标记由定义中的替换列表替换(调用宏)。
要回答另一个问题,预处理在正常编译和链接之前进行,因此在实现文件中执行#undef
只会影响该文件。在标头中,它会影响包含该标头的每个文件。