使用#include" filename"

时间:2016-10-21 19:07:52

标签: c++ include

read

  

#include filename导致该指令被"之间指定序列标识的源文件的全部内容替换。分隔符。

下面是一个简短的例子。使用g++ main.cpp f.h f.cpp进行编译会产生编译错误。删除#include中的f.cpp后,该程序正常运行。我有两个问题。

  1. 原始程序中出错的原因是什么?

  2. #include filename是否真的只是用引用文件的内容替换该指令?

  3. 我问第二个问题,因为当我用int f();(这是f.h的确切内容)替换有问题的行时,程序也能正确运行。

    谢谢。

    f.h

    int f();
    

    f.cpp

    #include "f.h" // problem
    int f() { return 1; }
    

    的main.cpp

    #include <iostream>
    #include "f.h"
    int main() {
        std::cout << f() << std::endl;
    }
    

    使用原始程序运行g++ main.cpp f.h f.cpp的错误消息是

    f.cpp: In function 'int f()':
    f.cpp:2:5: internal compiler error: in ggc_record_overhead, at ggc-common.c:1013
     int f() { return 1; }
         ^
    0x8ae8eb ggc_record_overhead(unsigned long, unsigned long, void*, char const*, int, char const*)
            /apps2/tools/gcc/4.9.2/gcc-4.9.2-src/gcc/ggc-common.c:1013
    0xc4af71 ggc_internal_alloc_stat(unsigned long, char const*, int, char const*)
            /apps2/tools/gcc/4.9.2/gcc-4.9.2-src/gcc/ggc-page.c:1317
    0xa48462 get_combined_adhoc_loc(line_maps*, unsigned int, void*)
            /apps2/tools/gcc/4.9.2/gcc-4.9.2-src/libcpp/line-map.c:136
    0xa9a5ff gimple_set_block(gimple_statement_base*, tree_node*) [clone .isra.8]
            /apps2/tools/gcc/4.9.2/gcc-4.9.2-src/gcc/gimple.h:1489
    0xa9a5ff lower_stmt
            /apps2/tools/gcc/4.9.2/gcc-4.9.2-src/gcc/gimple-low.c:239
    0xa9a5ff lower_sequence
            /apps2/tools/gcc/4.9.2/gcc-4.9.2-src/gcc/gimple-low.c:206
    0xa9b481 lower_gimple_bind
            /apps2/tools/gcc/4.9.2/gcc-4.9.2-src/gcc/gimple-low.c:415
    0xa9b5c6 lower_function_body
            /apps2/tools/gcc/4.9.2/gcc-4.9.2-src/gcc/gimple-low.c:118
    0xa9b5c6 (anonymous namespace)::pass_lower_cf::execute() [clone .lto_priv.4979]
            /apps2/tools/gcc/4.9.2/gcc-4.9.2-src/gcc/gimple-low.c:184
    Please submit a full bug report,
    with preprocessed source if appropriate.
    Please include the complete backtrace with any bug report.
    See <http://gcc.gnu.org/bugs.html> for instructions.
    

    更新

    我发现g++ main.cpp f.cpp f.h失败,因为我的目录中有一个文件f.h.gch。清理.gch文件后,程序正确编译。

    (对不起,我之前没有提供这些信息,因为我刚注意到它。)

    但是,g++ main.cpp f.cpp f.h会生成f.h.gch。因此,如果我连续编译两次,那就是错误。

    根据东辉的建议,从f.h删除g++也会正确编译。并且,它不会生成f.h.gch文件。

    我的问题可能与What is a .h.gch file?

    重复

1 个答案:

答案 0 :(得分:1)

在g ++命令中,删除f.h。