namespace::variable 的多重定义,即使使用 ifndef
Multiple definition of namespace::variable even using ifndef
我知道我一定是做错了什么。
rank.h
#ifndef RANK_H
#define RANK_H
namespace mmi {
int chunk;
void rank(int my_rank);
}
#endif
rank.cpp
#include "rank.h"
namespace mmi {
//do something with chunk
}
main.cpp
#include "rank.h"
int main() {
mmi::chunk = 1;
}
以及编译的输出;
g++ -g -Wall -std=gnu++11 -c -o main.o main.cpp
g++ -g -Wall -std=gnu++11 -c -o rank.o rank.cpp
mpic++ main.o rank.o -o main
rank.o:(.bss+0x0): multiple definition of `mmi::chunk'
main.o:(.bss+0x0): first defined here
collect2: error: ld returned 1 exit status
Makefile:12: recipe for target 'main' failed
make: *** [main] Error 1
我的理解是头文件被多次包含。但我希望通过使用 #ifndef
.
来纠正这个问题
所以,请问这是怎么回事?
行
int chunk;
不仅是声明,更是定义。每个 #include
包含 .hpp 文件的 .cpp 文件最终都会定义它。
改为
extern int chunk;
然后,确保在 .cpp 文件中定义它。
rank.cpp
#include "rank.h"
namespace mmi {
int chunk;
//do something with chunk
}
在 C++ 中,每个文件(又名翻译单元)都是单独编译的。所以main.cpp的编译完全独立于rank.cpp的编译。一个编译中的#define 不可能影响另一个编译。当你 link 你的两个目标文件在一起时,定义已经消失了。
include guards的目的是为了防止在一次编译中两次包含一个头文件,而不是在多次编译中。
我知道我一定是做错了什么。
rank.h
#ifndef RANK_H
#define RANK_H
namespace mmi {
int chunk;
void rank(int my_rank);
}
#endif
rank.cpp
#include "rank.h"
namespace mmi {
//do something with chunk
}
main.cpp
#include "rank.h"
int main() {
mmi::chunk = 1;
}
以及编译的输出;
g++ -g -Wall -std=gnu++11 -c -o main.o main.cpp
g++ -g -Wall -std=gnu++11 -c -o rank.o rank.cpp
mpic++ main.o rank.o -o main
rank.o:(.bss+0x0): multiple definition of `mmi::chunk'
main.o:(.bss+0x0): first defined here
collect2: error: ld returned 1 exit status
Makefile:12: recipe for target 'main' failed
make: *** [main] Error 1
我的理解是头文件被多次包含。但我希望通过使用 #ifndef
.
所以,请问这是怎么回事?
行
int chunk;
不仅是声明,更是定义。每个 #include
包含 .hpp 文件的 .cpp 文件最终都会定义它。
改为
extern int chunk;
然后,确保在 .cpp 文件中定义它。
rank.cpp
#include "rank.h"
namespace mmi {
int chunk;
//do something with chunk
}
在 C++ 中,每个文件(又名翻译单元)都是单独编译的。所以main.cpp的编译完全独立于rank.cpp的编译。一个编译中的#define 不可能影响另一个编译。当你 link 你的两个目标文件在一起时,定义已经消失了。
include guards的目的是为了防止在一次编译中两次包含一个头文件,而不是在多次编译中。