【问题标题】:Where is this backward_warning.h #warning coming from?这个backward_warning.h #warning 来自哪里?
【发布时间】:2011-11-26 17:43:30
【问题描述】:

如果不查看我的 XCode 项目中的每个源文件,有没有办法找出哪个 #include 触发了以下警告?

#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中点击错误只会打开backward_warning.h文件,完全没用。

我知道警告的含义,我知道如何修复它(当我看到有问题的文件并可以查看它的#includes 时)...但我只是不知道如何找到导致错误的文件!

【问题讨论】:

    标签: c++ xcode compiler-warnings deprecated


    【解决方案1】:

    使用 GCC 的 -H 选项 - 这将列出正在包含的头文件(以及嵌套指示,以便您查看哪个文件包含哪个头)。

    使用-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 中执行相同的功能。

    【讨论】:

    • 那行得通。发现我有自己的“Vector.h”(基于数学的向量,而不是 STL 向量)编译器与 STL 向量头混淆了。一点点文件重命名,警告就消失了。永远不会发现只是将标题视为“Vector.h”是我自己的一段代码。
    • @Piku:将一个保留大小写但不区分大小写的 MacOS 文件系统归为一类。也许您可以/应该使用#include &lt;project/Vector.h&gt;(或#include "project/Vector.h")机制将您的标头与系统标头隔离开来。
    【解决方案2】:

    正如你所说,文件/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,您会收到关于已弃用函数的类似警告 - 这些函数是来自 OpenSSL 的 SHA1 函数。这很麻烦,请客气点。)

    【讨论】:

      【解决方案3】:

      你在某处有一个旧样式的标题。

      类似的东西

      IE:

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

      如果它是从库中包含的,那么我认为你是 SOL,我个人不会翻遍库来让它工作,你必须更新它们以使用命名空间。等等。

      【讨论】:

        猜你喜欢
        • 2017-06-04
        • 2021-11-14
        • 1970-01-01
        • 2013-03-13
        • 2016-01-01
        • 2018-05-26
        • 2016-08-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多