将代码拆分为多个文件

3

我知道之前已经有很多人问过这个问题,但是我还是遇到了麻烦。

我最开始只有一个包含所有代码的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
目前,我的代码如下:
//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,但那只能防止在同一文件中重新定义,对吗?我该如何解决这个问题?
编辑:修改了问题,我刚意识到是变量被多次定义,而不是函数。
2个回答

1

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

对于这种情况,请使用define。定义的区别在于,预处理器宏并不会自己创建任何目标代码,并且也不会创建任何符号。声明某种const类型而不是define有其优势,但我认为不必担心链接时的符号冲突是更大的好处。

你的头文件还需要包含保护


好的,现在我明白了。我用#definedefinitions定义为int a = 0,然后在我的main.cpp文件中,在头文件之后立即引入了definitions。这是正确的风格吗? - Draksis
这要看情况。如果定义在头文件中是为了提供某些功能,那么它们应该放在头文件中。如果定义只是一些全局魔法值,只有在主程序的上下文中才有意义,我会考虑使用在main.cpp中定义的const int,而不是define。有些人会创建一个专门包含全局定义的头文件,这肯定更具可扩展性。 - Josh
如果可以的话,我更喜欢将变量定义放在我的 header.h 文件中,这样当我添加一个新的全局变量时,我只需要在一个文件中添加它,而不必在两个文件之间来回切换。 - Draksis
没有任何问题。不过,你可能考虑使用一个更具描述性的名称,而不是header.h :) - Josh
是的,在我的实际文件中,我使用了更好的名称。感谢您的帮助! - Draksis

-3
//header.h
void foo();
void bar();

应该是

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接