3

プリプロセッサコマンドは、変数とクラスが複数回定義されるのを防ぐためのヘッダーファイルの重要な部分であることを理解しています。

変数が複数回定義されているという問題が発生しています。プリプロセッサラッパーを使用している場合でも同様です。コンパイラエラーが発生しているサンプルプロジェクトは次のとおりです。

ヘッダ:

// 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:関数 `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

ヘッダーファイルでプリプロセッサ条件を使用しているときにこのエラーが発生するのはなぜですか?

4

2 に答える 2

9

インクルードガードは、複数の定義から保護しません。それらは、無限の再帰的包含からのみ保護します。(もちろん、同じヘッダーを複数の翻訳単位に含めることができます!)

ヘッダーにオブジェクト定義*を含めることはできません。宣言のみ:

header.hpp:

extern int a;

file.cpp:

#include "header.hpp"

int a = 12;

*)ヘッダーファイルには、関数やクラスメンバー関数だけでなく、クラス定義を含めることができます。inline

于 2012-11-08T04:06:00.203 に答える
2

extern int myInt;ヘッダーファイルで使用しint myInt;、定義する単一の.cppファイルにのみ書き込む必要があります。

一部のプロジェクトでは、「IN_FOO_CPP」などのプリプロセッサマクロを使用して、#ifdefsで自動的に実行します。

于 2012-11-08T04:05:16.160 に答える