0

私はこれをやろうとしています:

#pragma once
#include <fstream>
#include <string>

static std::ofstream ErrorLog;

void InitErrorLog(std::string FileName) {
    ErrorLog.open(FileName);
}

しかし、複数の CPP ファイルで #include を実行すると、「1 つまたは複数の複数定義されたシンボルが見つかりました」というエラーが発生します。STL は何をしているのでしょうか (cout、cin、cerr などを提供するためです。このアプローチは、cerr をリダイレクトする代替手段として生まれました)。

4

2 に答える 2

4

ヘッダー ファイルでの定義を提供しています。代わりに、ソース ファイルで定義し、 extern 宣言をヘッダーに残します。ErrorLog

ソース

std::ofstream ErrorLog;

void InitErrorLog(std::string FileName) {
    ErrorLog.open(FileName);
}

ヘッダ

extern std::ofstream ErrorLog;

void InitErrorLog(std::string FileName);

さらに、関数をヘッダーに保持するには、それを作成する必要がありますinline

于 2012-06-18T20:03:29.063 に答える
2

1 つの定義ルールを破っています。メソッドを作成する必要がありますinline

inline void InitErrorLog(std::string FileName) {
    ErrorLog.open(FileName);
}

staticまた、変数を宣言すると、翻訳単位ごとにコピーが作成されることに注意してください。つまり、グローバルではありません。グローバルにするには、ヘッダーで宣言externし、単一の実装ファイルで定義する必要があります。

于 2012-06-18T20:03:25.817 に答える