Откуда исходит это предупреждение back_warning.h #warning?

Есть ли способ узнать, какой #include вызывает следующее предупреждение, не просматривая каждый исходный файл в моем проекте XCode?

#warning This file includes at least one deprecated or antiquated header. 
Please consider using one of the 32 headers found in section 17.4.1.2 of the 
C++ standard. Examples include substituting the <X> header for the <X.h> 
header for C++ includes, or <iostream> instead of the deprecated header 
<iostream.h>. To disable this warning use -Wno-deprecated.

Щелчок по ошибке в XCode просто открывает файл back_warning.h, что совершенно бесполезно.

Я знаю, что означает предупреждение, я знаю, как его исправить (когда я вижу рассматриваемый файл и могу посмотреть его #includes)... но я просто не знаю, как найти файл, вызывающий ошибку!


person Piku    schedule 26.11.2011    source источник


Ответы (3)


Используйте параметр -H для GCC - это перечислит файлы заголовков, которые включаются (вместе с указанием вложенности, чтобы вы могли видеть, какой файл включает какой заголовок).

С -H ошибка будет помещена в поток вывода, ясно показывающий, как компилятор добрался до backward_warning.h.

Например, если я включу hash_map, я увижу:

mikeb@ubuntu:~$ g++  -H -c test.cpp
. /usr/include/c++/4.4/backward/hash_map
.. /usr/include/c++/4.4/backward/backward_warning.h
In file included from /usr/include/c++/4.4/backward/hash_map:60,
                 from test.cpp:3:
/usr/include/c++/4.4/backward/backward_warning.h:28: warning: #warning This file
includes at least one deprecated or antiquated header which may be removed without
further notice at a future date. Please use a non-deprecated interface with equivalent 
functionality instead. For a listing of replacement headers and interfaces, consult 
the file backward_warning.h. To disable this warning use -Wno-deprecated.

... a bunch of snipped output ...

Кстати, /showIncludes выполняет ту же функцию в MSVC.

person Michael Burr    schedule 26.11.2011
comment
Это сработало. Обнаружил, что у меня есть собственный «Vector.h» (который делает математические векторы, а не векторы STL), который компилятор путает с заголовком вектора STL. Небольшое переименование файла и предупреждение исчезло. Никогда бы не обнаружил, что, просто взглянув на заголовки, поскольку «Vector.h» был частью моего собственного кода. - person Piku; 26.11.2011
comment
@Piku: Обратите внимание на сохраняющую регистр, но нечувствительную к регистру файловую систему MacOS. Возможно, вы могли бы/должны использовать механизм #include <project/Vector.h> (или #include "project/Vector.h") для изоляции ваших заголовков от системных заголовков. - person Jonathan Leffler; 27.11.2011

Как вы сказали, файл /usr/include/c++/4.2.1/backward/backward_warning.h содержит текст, который вы цитируете. Заголовки, которые включают backward_warning.h:

  • /usr/include/c++/4.2.1/backward/algo.h
  • /usr/include/c++/4.2.1/backward/algobase.h
  • /usr/include/c++/4.2.1/backward/alloc.h
  • /usr/include/c++/4.2.1/backward/bvector.h
  • /usr/include/c++/4.2.1/backward/complex.h
  • /usr/include/c++/4.2.1/backward/defalloc.h
  • /usr/include/c++/4.2.1/backward/deque.h
  • /usr/include/c++/4.2.1/backward/fstream.h
  • /usr/include/c++/4.2.1/backward/function.h
  • /usr/include/c++/4.2.1/backward/hash_map.h
  • /usr/include/c++/4.2.1/backward/hash_set.h
  • /usr/include/c++/4.2.1/backward/hashtable.h
  • /usr/include/c++/4.2.1/backward/heap.h
  • /usr/include/c++/4.2.1/backward/iomanip.h
  • /usr/include/c++/4.2.1/backward/iostream.h
  • /usr/include/c++/4.2.1/backward/istream.h
  • /usr/include/c++/4.2.1/backward/iterator.h
  • /usr/include/c++/4.2.1/backward/list.h
  • /usr/include/c++/4.2.1/backward/map.h
  • /usr/include/c++/4.2.1/backward/multimap.h
  • /usr/include/c++/4.2.1/backward/multiset.h
  • /usr/include/c++/4.2.1/backward/new.h
  • /usr/include/c++/4.2.1/backward/ostream.h
  • /usr/include/c++/4.2.1/backward/pair.h
  • /usr/include/c++/4.2.1/backward/queue.h
  • /usr/include/c++/4.2.1/backward/rope.h
  • /usr/include/c++/4.2.1/backward/set.h
  • /usr/include/c++/4.2.1/backward/slist.h
  • /usr/include/c++/4.2.1/backward/stack.h
  • /usr/include/c++/4.2.1/backward/stream.h
  • /usr/include/c++/4.2.1/backward/streambuf.h
  • /usr/include/c++/4.2.1/backward/strstream
  • /usr/include/c++/4.2.1/backward/tempbuf.h
  • /usr/include/c++/4.2.1/backward/tree.h
  • /usr/include/c++/4.2.1/backward/vector.h

Следовательно, код, который вы компилируете, должен включать заголовок, например:

#include <vector.h>

вместо предпочтительного:

#include <vector>

И компилятор становится суетливым по этому поводу. Исправление состоит в том, чтобы найти код, который включает нестандартный заголовок, и обновить его, чтобы использовать стандартный заголовок.

(Вы получите аналогичные предупреждения об устаревших функциях, если скомпилируете git — это функции SHA1 из OpenSSL. Если быть вежливым, это неприятно.)

person Jonathan Leffler    schedule 26.11.2011

У вас где-то есть заголовок в старом стиле.

что-то вроде этого

IE:

#include <iostream.h>  //instead of <iostream>
#include <stdlib.h>    //instead of <cstdlib>
#include <stdio.h>    //instead of <cstdio>

если он включен из библиотеки, то я думаю, что вы SOL, лично я бы не стал рыться в библиотеке, чтобы заставить ее работать, вам придется обновить их, чтобы использовать пространства имен. и тому подобное.

person 111111    schedule 26.11.2011