Un modo per implementare gli avvisi di deprecazione consiste nel produrre avvisi sulle chiamate alle funzioni deprecate, a meno che non si stia chiamando da un contesto deprecato. In questo modo il codice legacy può chiamare il codice legacy senza produrre avvertimenti che equivalgono solo al rumore.Come posso eliminare gli avvisi obsoleti in funzioni deprecate in GCC?
Questa è una linea di pensiero ragionevole, e si riflette nelle implementazioni che vedo in GCC 4.2 (1) e in Clang 4.0 (2) su OS X e in Clang 3.0 (3) su Ubuntu.
- (1): i686-apple-darwin11-LLVM-g ++ - 4.2 (GCC) 4.2.1 (Basato su Apple Inc. costruire 5658) (LLVM costruire 2336.11.00)
- (2): Apple clang versione 4.0 (tag/Apple/clang-421.0.57) (basato su LLVM 3.1svn)
- (3): Ubuntu clang versione 3.0-6ubuntu3 (tag/RELEASE_30/finale) (basato su LLVM 3.0)
Tuttavia, quando compilo con GCC 4.6 avvertenze (4) su Ubuntu, ottengo deprecato per tutte le chiamate di deprecat funzioni ed, indipendentemente dal contesto. È una regressione nella funzionalità? Ci sono opzioni del compilatore che posso usare per ottenere l'altro comportamento?
- (4): g ++ (Ubuntu/Linaro 4.6.3-1ubuntu5) Programma 4.6.3
Esempio:
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
}
uscita da GCC 4.2 (Sì, Ricevo lo stesso avvertimento due volte, ma non me ne importa niente:
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)
uscita dal 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]
Come posso convincere il GCC 4.6 che dovrebbe darmi lo stesso output come GCC 4.2?
È assolutamente possibile che questo non abbia mai funzionato con GCC di FSF, che il comportamento 4.2 che si sta vedendo è una patch Apple per GCC. Ti capita di avere FSF GCC 4.2 installato ovunque per controllare? – hvd
@hvd Hai ragione. Mi piacerebbe vedere quel test, ma non ho 4.2 a portata di mano:/ –