11

この再定義エラーを修正する方法が本当にわかりません。

コンパイル+エラー

g++ main.cpp list.cpp line.cpp
In file included from list.cpp:5:0:
line.h:2:8: error: redefinition of âstruct Lineâ
line.h:2:8: error: previous definition of âstruct Lineâ

main.cpp

#include <iostream>
using namespace std;
#include "list.h"

int main() {
    int no;
    // List list;

    cout << "List Processor\n==============" << endl;
    cout << "Enter number of items : ";
    cin  >> no;

    // list.set(no);
    // list.display();
}

list.h

#include "line.h"
#define MAX_LINES 10
using namespace std;

struct List{
    private:
        struct Line line[MAX_LINES];
    public:
        void set(int no);
        void display() const;
};

line.h

#define MAX_CHARS 10
struct Line {
    private:
        int num;
        char numOfItem[MAX_CHARS + 1]; // the one is null byte
    public:
        bool set(int n, const char* str);
        void display() const;
};

リスト.cpp

#include <iostream>
#include <cstring>
using namespace std;
#include "list.h"
#include "line.h"

void List::set(int no) {}

void List::display() const {}

ライン.cpp

#include <iostream>
#include <cstring>
using namespace std;
#include "line.h"

bool Line::set(int n, const char* str) {}

void Line::display() const {}
4

3 に答える 3

29

ヘッダーにインクルード ガードを配置する必要があります。

#ifndef LIST_H_
#define LIST_H_

// List.h code

#endif
于 2013-02-23T15:59:51.330 に答える
18

list.cpp には、「line.h」と「list.h」の両方が含まれています。しかし、「list.h」にはすでに「line.h」が含まれているため、実際には「list.h」がコードに 2 回含まれています。(プリプロセッサは、既に持っているものを含めないほどスマートではありません)。

次の 2 つの解決策があります。

  • "list.h" を list.cpp ファイルに直接インクルードしないでください。ただし、これはスケーリングしない慣行です。すべてのヘッダー ファイルに何が含まれているかを覚えておく必要があり、それは非常に迅速に行われます。
  • @juanchopanza で説明されているように、インクルード ガードを使用します。
于 2013-02-23T16:02:02.963 に答える
2

「line.h」を 2 回インクルードしていますが、ヘッダー ファイルにインクルード ガードがありません。

次のようなものを追加すると:

 #ifndef LINE_H
 #define LINE_H
 ... rest of header file goes here ... 
 #endif

ヘッダーファイルに追加すると、すべて正常に機能します。

于 2013-02-23T16:01:44.387 に答える