【问题标题】:Splitting up Code into Multiple Files将代码拆分为多个文件
【发布时间】:2011-08-01 04:14:44
【问题描述】:

我知道这已经被问过十亿次了,但我仍然遇到问题。

我从一个包含我所有代码的 main.cpp 文件开始。说它看起来像这样:

int a = 0;
void foo() {
    a+1;
}

void bar() {
    a+2;
}

int main() {
    foo();
    bar();
    a + 3;
}

现在我想将此代码拆分为多个文件以便于管理。我希望只有一个标头header.h 和三个.cpp 文件:main.cppfoo.cppbar.cpp

ATM,这是我的:

//header.h
int a = 0;
void foo();
void bar();

.

//foo.cpp
#include "header.h"
void foo() {a+1;}

.

//bar.cpp
#include "header.h"
void bar() {a+2;}

.

//main.cpp
#include "header.h"
int main() {
    foo();
    bar();
    a + 3;
}

不幸的是,链接器一直在抱怨我多次定义了a。我试过使用#ifdef,但这只能防止在同一个文件中重新定义,对吗?我怎样才能做到这一点?

编辑:修改了问题,我才意识到这是多次定义的变量,而不是函数。

【问题讨论】:

    标签: c++ visual-studio-2010 linker


    【解决方案1】:

    我认为更大的问题是您在 header 文件中实现某些东西。问题是当您将标头包含到多个目标文件中时,您将在链接器时遇到问题。不要这样做。

    对这类事情使用define。它们的不同之处在于 define 作为预处理器宏,它本身不会创建任何目标代码,也不会创建任何符号。声明某种 const 类型而不是 define 有一些好处,但我认为不必担心链接时的符号冲突是一个更大的好处。

    你的头文件也需要include guards

    【讨论】:

    • 好的,我现在知道了。我#defined definitionsint a = 0,然后在我的main.cpp 中,在顶部包含definitions,就在我的标题之后。这是正确的风格吗?
    • 嗯,这取决于。您在标题中提供的某些功能是否需要定义?如果他们齐头并进,他们应该在标题中。如果定义只是一些仅在主程序上下文中有意义的全局魔法值,我会考虑使用在 main.cpp 中定义的const int,而不是define。有些人专门制作一个包含全局定义的标题,这肯定更具可扩展性。
    • 如果可以的话,我更喜欢将变量定义放在我的header.h 中,这样当我添加一个新的全局变量时,我可以只将它添加到一个文件中,而无需在两者之间来回切换两个文件。
    • 这没有错。不过,您可能会考虑一个比 header.h 更具描述性的名称:)
    • 是的,在我的实际文件中,我使用了更好的名称。感谢您的帮助!
    【解决方案2】:
    //header.h
    void foo();
    void bar();
    

    应该是

    extern void foo();
    extern void bar();
    

    【讨论】:

      猜你喜欢
      • 2014-03-12
      • 1970-01-01
      • 1970-01-01
      • 2010-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-02
      相关资源
      最近更新 更多