Eine Möglichkeit zur Implementierung von Verwarnungswarnungen besteht darin, Warnungen bei Aufrufen veralteter Funktionen zu erzeugen, sofern Sie nicht von einem veralteten Kontext aus aufrufen. Auf diese Weise kann Legacy-Code Legacy-Code aufrufen, ohne Warnungen zu erzeugen, die nur Rauschen darstellen.Wie kann ich veraltete Warnungen in veralteten Funktionen in GCC loswerden?
Dies ist eine vernünftige Linie des Denkens, und es spiegelt sich in den Implementierungen, die ich in GCC 4.2 (1) und Clang 4.0 (2) auf OS X sowie Clang 3.0 (3) auf Ubuntu.
- (1): i686-apple-darwin11-llvm-g ++ - 4.2 (GCC) 4.2.1 (Basierend auf Apple Inc. bauen 5658) (LLVM bauen 2336.11.00)
- (2): Apple Clang Version 4.0 (Tags/Apple/clang-421.0.57) (basierend auf LLVM 3.1svn)
- (3): Ubuntu Clang Version 3.0-6ubuntu3 (Tags/RELEASE_30/endgültig) (basierend auf LLVM 3.0)
Allerdings, wenn ich mit GCC 4.6 (4) auf Ubuntu kompilieren, ich veraltet Warnungen erhalten für alle Aufrufe von deprecat ed Funktionen, unabhängig vom Kontext. Ist das eine Regression in der Funktionalität? Gibt es Compileroptionen, die ich verwenden kann, um das andere Verhalten zu erhalten?
- (4): g ++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Beispielprogramm:
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
}
Output von GCC 4.2 (ja, Ich bekomme die gleiche Warnung zweimal, aber das interessiert mich nicht):
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)
Ausgabe von 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]
Wie kann ich überzeugen 4.6 GCC, dass sie die gleiche Leistung wie GCC 4.2 geben Sie mir sollte?
Es ist durchaus möglich, dass dies nie mit FSF GCC funktioniert hat, dass das 4.2 Verhalten, das Sie sehen, ein Apple-Patch für GCC ist. Haben Sie zufällig irgendwo FSF GCC 4.2 installiert? – hvd
@hvd Sie haben Recht. Ich würde gerne diesen Test sehen, aber ich habe keine 4.2 zur Hand:/ –