2011-11-26 15 views
5

Nie przeglądając każdego pliku źródłowego w moim projekcie XCode, czy istnieje sposób na sprawdzenie, które #include wywołuje następujące ostrzeżenie?Skąd pochodzi to ostrzeżenie #verning_warning.h?

#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. 

Kliknięcie błędu w Xcode tylko otwiera plik backward_warning.h, który jest całkowicie bezużyteczny.

Wiem, co oznacza ostrzeżenie, wiem jak to naprawić (kiedy widzę dany plik i mogę obejrzeć jego #includes) ... ale po prostu nie wiem, jak znaleźć plik powodujący błąd!

Odpowiedz

10

Użyj opcji do GCC -H - że wyświetli listę plików nagłówkowych, które są dołączone (wraz ze wskazaniem zagnieżdżenia, dzięki czemu można zobaczyć, który plik zawiera nagłówek).

Po wprowadzeniu -H błąd zostanie umieszczony w strumieniu wyjściowym, wyraźnie pokazując, w jaki sposób kompilator dotarł do backward_warning.h.

Na przykład, kiedy to hash_map, to widać:

[email protected]:~$ 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 ... 

Jako bok /showIncludes spełnia tę samą funkcję w MSVC.

+3

To działało. Znalazłem własny "Vector.h" (czyli wektory matematyczne, a nie wektory STL), które kompilator mylił z nagłówkiem STL Vector. Mały fragment nazwy pliku i ostrzeżenie zniknęło. Nigdy by się nie okazało, że po prostu patrząc na nagłówki jako "Vector.h" był fragment mojego kodu. – Piku

+1

@Piku: Chalk jeden do systemu plików systemu MacOS chroniącego skrzynkę, ale nie uwzględniającego wielkości liter. Może mógłbyś/powinieneś użyć mechanizmu '#include ' (lub '#include '/ Vector.h" '), aby odizolować nagłówki od nagłówków systemu. –

0

Masz gdzieś nagłówek starego stylu.

coś takiego

IE:

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

jeśli jest włączone z biblioteki to myślę, że jesteś SOL, ja osobiście nie grzebać biblioteki aby zmusić go do pracy będziesz muszą zaktualizować je, aby używać przestrzeni nazw. i inne takie.

2

Tak jak stwierdzono, plik /usr/include/c++/4.2.1/backward/backward_warning.h zawiera cytowany tekst.Nagłówki takich backward_warning.h to:

  • /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

Dlatego kod jesteś kompilacji musi być w tym nagłówku, takie jak:

#include <vector.h> 

zamiast preferowanym:

#include <vector> 

I kompilator robi się o tym głupio. Poprawka polega na znalezieniu kodu, który zawiera pre-standardowy nagłówek i zaktualizowaniu go do używania standardowego nagłówka.

(można uzyskać podobne ostrzeżenia o nieaktualnych funkcji jeśli skompilować git - funkcje są funkcjami SHA1 z OpenSSL Jest to uciążliwe, być uprzejmy o nim.).

Powiązane problemy