C++ 命名空间::变量的多个定义,即使使用ifndef

C++ 命名空间::变量的多个定义,即使使用ifndef,c++,c++11,namespaces,ifndef,C++,C++11,Namespaces,Ifndef,我知道我一定是做错了什么 等级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 } #include "rank.h" namespace mmi { int chunk; //do something with

我知道我一定是做错了什么

等级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
}
#include "rank.h"
namespace mmi {
   int chunk;
  //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;
它不仅是一个声明,也是一个定义。每个包含的.cpp文件都会定义.hpp文件

换成

extern int chunk;
然后,确保在.cpp文件中定义它

rank.cpp

#include "rank.h"
namespace mmi {
//do something with chunk
}
#include "rank.h"
namespace mmi {
   int chunk;
  //do something with chunk
}
在C++中,每个文件(AKA翻译单元)被编译为<强>单独< /强>。因此main.cpp的编译完全独立于rank.cpp的编译。一次编译中的定义不可能影响另一次编译。当您将两个对象文件链接到一起时,定义已经消失


include guards的目的是防止在单个编译过程中两次包含一个头文件,而不是跨多个编译。

“即使使用ifndef…”。Include guards与程序范围内的多定义问题绝对没有关系。这里没有“偶数”
ifndef
与此无关,也不能以任何方式帮助您,形状。只是不要在头文件中定义非内联变量。
ifndef
,一个,防止在一个文件中包含多个变量。您有两个翻译单元,每个编译文件对应一个,每个单元只包含一次rank.h。当链接器将二者组合成一个程序并在每个编译的对象中找到
块时,就会出现问题。链接器不会试图找出哪个是真正的
块,因为它们都是,并且放弃了为00T!有一堆锅炉板。现在我所要做的就是说服老板让我使用现代编译器。@M.M,我还没能赶上C++14。这与对全局变量使用
内联
有何不同?@RSahu这是一个全局变量