Один из способов реализации предупреждений об отказе - это создавать предупреждения о вызовах устаревших функций, если вы не вызываете из устаревшего контекста. Таким образом, устаревший код может вызывать устаревший код, не создавая предупреждений, которые могут представлять собой только шум.
Это разумная линия мышления, и это отражается в реализациях, которые я вижу в GCC 4.2 (1) и Clang 4.0 (2) на OS X, а также на Clang 3.0 (3) на Ubuntu.
- (1): i686-apple-darwin11-llvm-g++ - 4.2 (GCC) 4.2.1 (основано на Apple Inc. build 5658) (LLVM build 2336.11.00)
- (2): Apple clang version 4.0 (теги/Apple/clang-421.0.57) (на основе LLVM 3.1svn)
- (3): Ubuntu clang version 3.0-6ubuntu3 (теги/RELEASE_30/final) (на основе LLVM 3.0)
Однако, когда я компилирую с GCC 4.6 (4) в Ubuntu, я получаю устаревшие предупреждения для всех вызовов устаревших функций независимо от контекста. Является ли это регрессом в функциональности? Существуют ли параметры компилятора, которые я могу использовать для получения другого поведения?
- (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?