2012-11-08 50 views
3

我知道预处理器命令是头文件的重要组成部分,可以防止多次定义变量和类。为什么我的C++包含多次定义变量?

我一直遇到问题,我的变量被定义多次 - 即使使用预处理器包装。这里是遇到编译器错误的示例项目:

部首:

// TestInclude.h 
#ifndef TESTINCLUDE_H_ 
#define TESTINCLUDE_H_ 

int myInt; 

#endif /*TESTINCLUDE_H_*/ 

C++:

// TestInclude.cpp 
#include <iostream> 
#include "IncludeMe.h" 
#include "TestInclude.h" 

int main(int argc, char* args[]) 
{ 
    std::cin >> myInt; 

    IncludeMe thisClass; 

    std::cin >> myInt; 
} 

部首:

// IncludeMe.h 
#ifndef INCLUDEME_H_ 
#define INCLUDEME_H_ 

class IncludeMe 
{ 
private: 
    int privateInt; 
public: 
    IncludeMe(); 
}; 

#endif /*INCLUDEME_H_*/ 

C++:

// IncludeMe.cpp 
#include <iostream> 
#include "IncludeMe.h" 
#include "TestInclude.h" 

IncludeMe::IncludeMe() 
{ 
    std::cout << "myInt: " << myInt; 
} 

然后我编译如下:

的Makefile:

all: 
g++ -g -o TestInclude TestInclude.cpp IncludeMe.cpp 

而且我得到以下错误:

/tmp/ccrcNqqO.o: In function `IncludeMe':
/home/quakkels/Projects/c++/TestInclude/IncludeMe.cpp:6: multiple definition of `myInt'
/tmp/ccgo6dVT.o:/home/quakkels/Projects/c++/TestInclude/TestInclude.cpp:7: first defined here
collect2: ld returned 1 exit status
make: *** [all] Error 1

为什么我收到的时候我使用预处理器此错误我的头文件中的条件?

回答

9

包括警卫不防止多重定义。它们只能防止无限递归包含。 (当然,您可以在多个翻译单元中包含相同的标题!)

您不应在标题中包含对象定义*;只有声明

header.hpp:

extern int a; 

file.cpp:

#include "header.hpp" 

int a = 12; 

*)您可以类定义在头文件中,以及inline函数和类成员函数。

+0

'extern'做什么? – quakkels

+0

形式上,它告诉编译器,下面的声明不是一个定义。简单来说,它告诉编译器声明变量的定义是在其他地方,链接器应该解决它。 – MSalters

2

您应该在头文件中使用extern int myInt;,并且只在需要定义它的单个.cpp文件中写入int myInt;

有些项目使用像“IN_FOO_CPP”这样的预处理器宏来使其自动使用#ifdefs进行。