Почему устаревшие C ++ предупреждения печатаются дважды? - PullRequest
3 голосов
/ 21 апреля 2019

Если у меня есть

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.

  • Объявление против определения: Документы , кажется, подразумевают, что его следует использовать с объявлением функции, а не с определением, но

    1. Мне нужно определить функцииinline в заголовке, а не объявлять в заголовке и определять в исходных файлах;и
    2. Попытка такого подхода не помешала бы предупреждению дважды печатать предупреждение.

1 Ответ

1 голос
/ 22 апреля 2019

Согласно документации GCC 8.2.0:

Устаревший атрибут выдает предупреждение , если функция используется где-либо в исходном файле . Это полезно при определении ожидаемых функций быть удаленным в будущей версии программы. Предупреждение также включает в себя расположение объявления устаревшей функции, чтобы пользователи могли легко найти дополнительную информацию о том, почему функция устарела, или что они должен сделать вместо этого. Обратите внимание, что предупреждения появляются только для использования ...

Должно быть только одно предупреждение, а не два. Так что это ошибка в GCC.

Существует связанная ошибка для атрибутов типа (а не атрибутов функций) под названием: C / C ++ __attribute__((deprecated)) не похоже на перенос объявлений, как подразумевается в документе.

Подтверждено как ошибка.

...