为什么我的C ++包含多次定义变量?

时间:2012-11-08 04:02:26

标签: c++ c-preprocessor

据我所知,预处理器命令是头文件的重要组成部分,可以防止vars和类被多次定义。

我遇到了多次定义我的vars的问题 - 即使使用预处理器包装器也是如此。以下是遇到编译器错误的示例项目:

部首:

// 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;
}

然后我这样编译:

生成文件:

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

我收到以下错误:

  

/tmp/ccrcNqqO.o:在函数`IncludeMe'中:
      /home/quakkels/Projects/c++/TestInclude/IncludeMe.cpp:6:`myInt'的多重定义
      /tmp/ccgo6dVT.o:/home/quakkels/Projects/c++/TestInclude/TestInclude.cpp:7:首先在这里定义
      collect2:ld返回1退出状态
      make:*** [all]错误1

当我在头文件中使用预处理器条件时,为什么会出现此错误?

2 个答案:

答案 0 :(得分:9)

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

你不应该在标题中有对象定义*;只有声明

<强> header.hpp:

extern int a;

<强> file.cpp:

#include "header.hpp"

int a = 12;

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

答案 1 :(得分:2)

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

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