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