gpt4 book ai didi

c++ - c++使用Eclipse的include方式

转载 作者:行者123 更新时间:2023-11-30 00:41:04 25 4
gpt4 key购买 nike

我了解到,如果我编译 main.cpp,编译器会将所有包含替换为文件的实际内容,即 #include "LongClassName.h" 替换为该文件中的文本。这是在 LongClassName.h 中递归完成的。最后,编译器看到一个巨大的“虚拟”文件,其中包含所有 .cpp 和 .h 文件的完整代码。

但在实际项目中似乎要复杂得多。我查看了为我的 Qt 项目创建的 Makefile Eclipse,似乎每个名为 file.o 的文件都有一个条目,它的依赖项是 file.cpp文件.h。所以这意味着 eclipse 会分别编译每个 .cpp(?)

这是否意味着 class.cpp 对 main.cpp 中的全局内容一无所知或更高层级的类包含层次结构?

我在尝试为长类名创建别名时偶然发现了这个问题。这是我的主类,我想用更短的名称调用静态函数:Ln::globalFunction() 而不是 LongClassName::globalFunction()

我有一个 LongClassName 类,我将其 header 包含在 main.cpp 中。这是主类。所有其他类都包含在其中。

LongClassName.h

#define PI 3.14159265

#include <QDebug>

Class LongClassName
{
...
public:
...
private:
...
};

typedef LongClassName Ln;

LongClassName.cpp

#include "Class1.h"
#include "Class2.h"
#include "Class3.h"

/*implementations of LongClassName's functions*/

所以我假设当编译器将代码包含在一个“虚拟”文件中时,每个类都将插入此源代码之后,因此每个类都应该知道 Ln 是一个LongClassName

的别名

这没用

那么将这个别名传播到所有类的最佳方式是什么?

由于反向依赖,我想避免在所有类中包含 LongClassname.h。 LongClassName 在其实现中包括所有其他类。几乎所有其他类都使用 LongClassName 的一些静态函数。

(目前我有一个单独的类 Ln 但尝试将它与 LongClassName 合并,因为它看起来更合乎逻辑。)

最佳答案

编译器知道如何将一个 .cpp 文件(如果它是一个 cpp 编译器)编译成一个名为“目标文件”的 .o 文件,这是你的代码翻译(并且可能被操作,优化,等)到机器代码。实际上,编译器创建了一个汇编代码,由汇编器翻译成机器代码。

因此每个 cpp 文件都被编译成不同的目标文件,并且对其他 cpp 文件中声明的变量一无所知,除非您在 cpp 文件或 h 文件中包含您希望目标文件知道的声明包括。

虽然编译是针对每个 cpp 单独完成的,但链接器将所有目标文件链接到单个可执行文件(或库),因此在全局命名空间中声明的变量确实是全局的,并且每个声明都没有显式放置在命名空间中命名空间放在全局命名空间中。

您可能会受益于阅读“编译”的所有阶段,例如:http://www.network-theory.co.uk/docs/gccintro/gccintro_83.html

关于c++ - c++使用Eclipse的include方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4478280/

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