0

で始まるヘッダーファイルがあります

#if !defined(__GLOBAL_H)
#define  __GLOBAL_H

次に、いくつかのコードに続いて

#endif

コードには関数宣言のみが含まれており、一部には他のヘッダー ファイルといくつかのテンプレート関数が含まれています。ただし、コードを 1 行追加すると問題が発生します。追加した関数が既にオブジェクト ファイルで定義されているというリンカ エラーが発生します。コンパイラとして Visual Studio 2012 Premium を使用しています。ヘッダー ファイルから既存の関数を削除しようとしましたが、これもコンパイラを通過します。一方、コンパイラに新しい可能性のある新しい行を追加すると、既に定義されていると言ってコンパイルを拒否します。何が間違っているのか、またはコンパイラ自体の内部でエラーに遭遇した可能性がありますか? (私は非常に疑問です)編集:解決策は、関数をヘッダーファイルで宣言することでしたが、CPPファイルで定義しました。しかし、実際の問題は、ヘッダー ファイルで宣言された型のオブジェクトを返すためにヘッダー ファイルをインクルードすると、コンパイルされないことでした。他のヘッダー ファイルで宣言された型である "Missing ; in front of *" というエラーの多く。

4

2 に答える 2

2

コードやエラー メッセージの使用を示していませんが、ヘッダーには宣言だけでなく、関数定義 (関数本体のコードを含む) があると思います。

これらは宣言する必要がありますinline。これにより、複数の翻訳単位で定義できます。または、単一のソース ファイルに移動して、ヘッダーに宣言だけを残して、1 つの翻訳単位でのみ定義されるようにします。

「1 つの定義規則」は、(インラインでない限り) 関数はプログラム内で 1 つの定義しか持てないことを示しています。

また、インクルード ガードはアンダースコアで開始したり、2 つのアンダースコアを含めたりしないでください。そのような名前は予約されています。

于 2013-04-20T23:30:10.180 に答える
1

インライン化されていない関数定義をヘッダー ファイルに追加することは、一般的に悪いことです。コンパイラは、関数が含まれているすべてのファイルで関数のコードを生成し、再定義エラーが発生します。代わりに、ヘッダーで関数を宣言し、定義をソース ファイル (.cpp) に配置する必要があります。

Global.h

#if !defined(__GLOBAL_H)
#define  __GLOBAL_H

void somefunction();  // <-- declaring the function.

#endif

SomeSource.cpp

#include "Global.h"

// Here is where define the function
void somefunction()
{
}
于 2013-04-20T23:28:42.637 に答える