我知道此事已被问过十亿次,但我仍然遇到麻烦。
我从一个包含我所有代码的main.cpp
文件开始。说它看起来像这样:
int a = 0;
void foo() {
a+1;
}
void bar() {
a+2;
}
int main() {
foo();
bar();
a + 3;
}
现在我想将此代码拆分为多个文件,以便于管理。我希望只有一个标头header.h
和三个.cpp
文件:main.cpp
,foo.cpp
和bar.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
,但这只是防止在同一个文件中重新定义,对吗?我怎样才能做到这一点?
编辑:修改了问题,我刚才意识到它是多次定义的变量,而不是函数。
答案 0 :(得分:1)
我认为更大的问题是您在标头文件中实现。问题是当您将标头包含到多个目标文件中时,您将在链接器时遇到问题。不要这样做。
使用define进行此类操作。它们的不同之处在于作为预处理器宏的define
本身不会创建任何对象代码,也不会创建任何符号。声明某种const
类型而不是define
是有好处的,但我认为不必担心链接时符号冲突会带来更大的好处。
您的标头文件还需要include guards
答案 1 :(得分:-3)
//header.h
void foo();
void bar();
应该是
extern void foo();
extern void bar();