代码之家  ›  专栏  ›  技术社区  ›  Gqqnbig

.cpp和.h文件的不同处理方式?

  •  0
  • Gqqnbig  · 技术社区  · 6 年前

    C.h有

    #ifndef UNTITLED3_C_H
    #define UNTITLED3_C_H
    
    class C {
     public:
      int F();
    };
    
    #endif //UNTITLED3_C_H
    

    h有

    #ifndef UNTITLED3_C_INL_H
    #define UNTITLED3_C_INL_H
    
    #include "C.h"
    
    int C::F() {
      return 1;
    }
    
    #endif //UNTITLED3_C_INL_H
    

    MCP.CPP有

    #include <iostream>
    #include "C.h"
    
    
    int main() {
      C c;
      std::cout << c.F() << std::endl;
      return 0;
    }
    

    现在我用下面的命令编译它们,但是失败了。

    $ g++ main.cpp C-inl.h -o main
    /tmp/ccVkEs1w.o: In function `main':
    main.cpp:(.text+0x1f): undefined reference to `C::F()'
    collect2: error: ld returned 1 exit status
    

    然后,我将c-inl.h重命名为c.cpp,编译工作正常。

    $ g++ main.cpp C.cpp -o main
    $ ./main 
    1
    

    为什么文件名会有不同?

    当文件是 main.cpp, C.h, and C.cpp ,main.cpp只包含c.h,c.cpp的内容如何启动?当文件是 main.cpp, C.h, and C-inl.h ,为什么内容不起作用?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Ripi2 user10587824    6 年前
    class C {
     public:
      int F();
    };
    

    是一个 宣言 函数的 F() 作为班级成员 C .

    int C::F() {
      return 1;
    }
    

    定义 这一功能。

    如果你只包括 C.h 您没有所需的定义 main() . 编译器知道您需要“f()”,但没有对其定义的引用(“未定义的引用”错误消息)。

    现在你重新命名 C-inl.h C.cpp 然后编译它。关键是 C.CPP 包括 小精灵 申报的地方。所以所有的东西都被发现,编译和链接。


    嘿, h。 包括 C.H 我告诉g++编译 h。 !!
    是的,但是 gcc docs 说明g++如何 .h 扩展:

    文件h

    C,C++,C或C + +头文件变成一个 预编译头文件 (默认)

    你需要把那个文件作为 .cpp 文件,不是预编译头。

        2
  •  1
  •   Miles Budnek    6 年前

    默认情况下,gcc通过查看指定文件的扩展名来确定如何处理该文件。

    gcc(1) :

    文件。 H
    将C、C++、ObjuleC或Objul-C++头文件转换为预编译头。

    所以gcc假设您希望使用“c-inl.h”和“c.h”作为预编译头。

    您可以使用 -x 旗帜:

    g++ main.cpp -x c++ C-inl.h -o main
    

    不过,我建议不要这样做。C++标题通常不会被编译成单独的编译单元,这样做会使下一个人读代码非常混乱。C-IL.“是” 头球。把它命名为“c.cpp”。