Одним из способов реализации предупреждений об устаревании является создание предупреждений о вызовах устаревших функций, если только вы не вызываете из устаревшего контекста. Таким образом, унаследованный код может вызывать унаследованный код без выдачи предупреждений, которые сводятся только к шуму.
Это разумное мышление, и оно отражено в реализациях, которые я вижу в 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 (на основе сборки 5658 Apple Inc.) (сборка LLVM 2336.11.00)
- (2): Apple clang версии 4.0 (теги / Apple / clang-421.0.57) (на основе LLVM 3.1svn)
- (3): Ubuntu clang версии 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?