Если у меня есть
namespace foo {
inline int bar() {
return 1119;
}
}
__attribute__((deprecated)) inline int bar() {
return 138;
}
в header.h
и
#include "header.h"
#include <iostream>
int main() {
int x = bar();
int y = foo::bar();
std::cout << x << std::endl;
std::cout << y << std::endl;
}
в source.cpp
, тогда
g++ source.cpp -o deprecated-test
приводит к
source.cpp: In function ‘int main()’:
source.cpp:5:17: warning: ‘int bar()’ is deprecated [-Wdeprecated-declarations]
int x = bar();
^
In file included from source.cpp:1:
header.h:7:40: note: declared here
__attribute__((deprecated)) int bar() {
^~~
source.cpp:5:17: warning: ‘int bar()’ is deprecated [-Wdeprecated-declarations]
int x = bar();
^
In file included from source.cpp:1:
header.h:7:40: note: declared here
__attribute__((deprecated)) int bar() {
(в Ubuntu 18.10 с g ++ 8.2.0).
Почему устаревшее предупреждение печатается дважды?
Заголовок некоторых предложений, которые не помогли бы:
[[deprecated]]
: Я знаю, что с C ++ 14 можно использовать атрибут [[deprecated]]
, но мне нужно работать с C ++ 11.
Объявление против определения: Документы , кажется, подразумевают, что его следует использовать с объявлением функции, а не с определением, но
- Мне нужно определить функции
inline
в заголовке, а не объявлять в заголовке и определять в исходных файлах;и - Попытка такого подхода не помешала бы предупреждению дважды печатать предупреждение.