【问题标题】:How does includes work in C++?包含在 C++ 中如何工作?
【发布时间】:2013-08-13 16:10:08
【问题描述】:

在我的文件夹中,我有一个小的 version.cpp 文件,其结构如下:

#include "thelibr/version.h"

const int major = MAJOR;
const int minor = MINOR;

我无法理解这段代码的作用以及代码的其余部分(存储在同一目录的其他文件中)如何使用它。

首先,我知道代码设置了两个变量(majorminor)的值,但我不清楚MAJORMINOR 的值在哪里设置。它们是否设置在thelibr/version.h

其次,我也不清楚上面给出的代码行何时执行。它们没有放在任何可能被其他文件中编码的其他方法调用的方法中。那么,这些行怎么调用呢?

第三,我看到字符串version 不存在于同一目录中的任何其他文件中。这是否意味着这些文件都没有使用存储在version.cpp 中的代码。我们不应该在其他文件中的某处包含version.h 文件以便能够使用version.cpp 中的代码吗?

第四,如果我们在version.cpp中设置majorminor变量的值,这些变量会在其他地方可见吗?这让我很惊讶,因为我们不使用任何像 globalexternal 这样的词。

【问题讨论】:

    标签: c++ variables include visibility


    【解决方案1】:

    C++ 没有像 Python 这样的模块系统,其中可以导出纯符号并将它们的值用于另一个源文件。相反,它有头文件:thelibr/version.h 的内容本质上是复制粘贴到 #include 行的位置。该文件中的任何内容都会被处理,就好像它是在version.cpp 文件中写出一样。

    要从一个文件导出到另一个文件(或创建可由链接器或动态加载器解释的库),请使用extern 存储,这是许多事情的默认设置。

    确定从一个.cpp 文件到下一个文件的可见内容相当复杂,但通常不能共享编译时值,例如版本号;您只能共享对运行时对象的访问权限,例如存储版本号的 ints。

    要使用另一个.cpp 文件中的majorminor,您可以在version.h 中声明:

    extern const int major;
    extern const int minor;
    

    然后是来自另一个文件的#include "thelibr/version.h"

    【讨论】:

    • 恕我直言,如果您提供一个示例,您不妨一路走下去,展示一个示例 version.h、version.cpp。否则我担心你的回答实际上可能会导致 OP 的困惑。
    • @busy_wait 我还应该添加什么?除了我认为他已经拥有的头球后卫之外,这个特殊的例子似乎已经涵盖了。问题在于许多其他类型的情况,例如inline 函数、static 对象和static 成员。老实说,听起来 OP 并没有真正准备好深入 C++。
    • 我认为关于#includes 的问题同样适用于看起来像C 的C++ 子集。IMO 最重要的一点应该是说明通过头文件共享#define 与共享#define 之间的区别. 共享在一个实现文件中实际定义的变量的声明。只是我的两分钱。我不想通过写我自己的来削弱你原本很好的答案。
    • @busy_wait SO 没有任何削弱,不要犹豫,贡献力量。再三考虑,我制作了这个“社区 wiki”,这样您就可以在不制作自己的新答案的情况下对其进行编辑。但是我们都不会因为点赞而获得积分。
    猜你喜欢
    • 1970-01-01
    • 2018-12-30
    • 2013-07-18
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    相关资源
    最近更新 更多