gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 01:19:26 25 4
gpt4 key购买 nike

C.h有

#ifndef UNTITLED3_C_H
#define UNTITLED3_C_H

class C {
public:
int F();
};

#endif //UNTITLED3_C_H

C-inl.h有

#ifndef UNTITLED3_C_INL_H
#define UNTITLED3_C_INL_H

#include "C.h"

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

#endif //UNTITLED3_C_INL_H

main.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、C.cpp时,main.cpp只包含C.h,C.cpp的内容是如何开始的?当文件为 main.cpp、C.h 和 C-inl.h 时,为什么内容不启动?

最佳答案

class C {
public:
int F();
};

是函数 F()声明作为类 C 的成员。

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

是该函数的定义

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

现在您将C-inl.h 重命名为C.cpp 并编译它。诀窍在于 C.cpp 确实包含完成声明的 C.h。所以一切都被找到、编译和链接。


嘿,C-inl.h 包括 C.h,我告诉 g++ 编译 C-inl.h!
是的,但是gcc docs评论 g++ 如何采用 .h 扩展名:

file.h

C, C++, Objective-C or Objective-C++ header file to be turned into a precompiled header (default)

并且您需要将该文件作为 .cpp 文件处理,而不是预编译头文件。

关于c++ - .cpp 和 .h 文件的不同处理方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57211397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com