-1

この問題について多くのことを読みましたが、適切な解決策が見つかりませんでした。だから私は4つのファイルを持っています:

includes.h - which contains all libraries I need in other files + some global functions
cities.h - which contains declarations of  2 classes
cities.cpp - which contains definitions of the 2 classes in cities.h
source.cpp - where is the main functon

そして、私はこれらのインクルードを持っています(そして必要としています)

//cities.h
#include "includes.h"

//cities.cpp
#include "cities.h"

//source.cpp
#include "cities.h"

すべてのファイルでほぼすべての組み合わせを試しましたが#ifndef、プログラムは引き続き同じエラーを返します: .function_X already declared in cities.objそして、このエラーは「includes.h」のすべての関数で繰り返されます。助けてください.これは私をたくさんの頭痛の種にします.

4

2 に答える 2

0

@sftrabbitが言ったことに加えて、ヘッダーファイルで関数を定義する必要があるヘッダーのみのライブラリを作成している場合、これはキーワードで可能inlineです。

// includes.h
inline void foo() {
    // implementation
}

inline int bar(int x) {
    // implementation
}

この の使用は、関数呼び出しinlineに対するコンパイラの提案としての他の使用と間違われるべきではありません。inline

于 2013-05-14T14:00:26.340 に答える
0

コメントで説明したように、includes.hヘッダー ファイルに関数定義があります。これが複数の実装ファイルに含まれていると、プログラム内でこれらの関数の複数の定義が作成されます。これは、 1 つの定義ルールを破ります。で関数を宣言しincludes.h、その定義をincludes.cppファイルに移動するだけです。

このようなもの:

// includes.h

void foo();
int bar(int);


// includes.cpp

void foo() {
  // implementation
}

int bar(int x) {
  // implementation
}

通常、この回答に続く質問を先取りしようと思います。いいえ、インクルード ガード ( #ifndef ...) はこれを防ぐためのものではありません。ヘッダーが単一の翻訳単位に複数回含まれるのを防ぐだけです。インクルードガードが停止しない複数の翻訳単位にヘッダーを含めています。

于 2013-05-13T21:46:49.483 に答える