实现弃用警告的一种方法是在调用弃用函数时生成警告,除非您从弃用的上下文中调用。这样,遗留代码可以调用遗留代码,而不会产生仅相当于噪音的警告。
这是一个合理的思路,它反映在我在 OS X 上的 GCC 4.2 (1) 和 Clang 4.0 (2) 以及 Ubuntu 上的 Clang 3.0 (3) 中看到的实现。
- (1):i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1(基于 Apple Inc. build 5658)(LLVM build 2336.11.00)
- (2):Apple clang 4.0 版本(tags/Apple/clang-421.0.57)(基于LLVM 3.1svn)
- (3):Ubuntu clang 3.0-6ubuntu3 版本(tags/RELEASE_30/final)(基于LLVM 3.0)
但是,当我在 Ubuntu 上使用 GCC 4.6 (4) 进行编译时,我会收到所有已弃用函数调用的弃用警告,与上下文无关。这是功能的回归吗?是否有我可以用来获得其他行为的编译器选项?
- (4): g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
示例程序:
int __attribute__((deprecated)) a() {
return 10;
}
int __attribute__((deprecated)) b() {
return a() * 2; //< I want to get rid of warnings from this line
}
int main() {
return b(); //< I expect a warning on this line only
}
GCC 4.2 的输出(是的,我确实收到了两次相同的警告。不过,我不在乎):
main.cpp: In function ‘int main()’:
main.cpp:10: warning: ‘b’ is deprecated (declared at main.cpp:5)
main.cpp:10: warning: ‘b’ is deprecated (declared at main.cpp:5)
GCC 4.6 的输出:
main.cpp: In function 'int b()':
main.cpp:6:9: warning: 'int a()' is deprecated (declared at main.cpp:1) [-Wdeprecated-declarations]
main.cpp:6:11: warning: 'int a()' is deprecated (declared at main.cpp:1) [-Wdeprecated-declarations]
main.cpp: In function 'int main()':
main.cpp:10:9: warning: 'int b()' is deprecated (declared at main.cpp:5) [-Wdeprecated-declarations]
main.cpp:10:11: warning: 'int b()' is deprecated (declared at main.cpp:5) [-Wdeprecated-declarations]
如何说服 GCC 4.6 它应该给我与 GCC 4.2 相同的输出?