2

static fstream複数のソース ファイルでa を使用する必要があります。ただし、単一のファイルからのみ使用でき、他のファイルからは使用できません。さらに、他のファイルで使用してもエラーは発生せず、何もしません。

これはコードです:

/// log.h
#ifndef LOG_H
#define LOG_H
#include <fstream>
static std::ofstream ofs;
#define LOG(level) ofs << level << ": "
#endif

/// test.cpp
#include "log.h"
#include "other.h"
int main()
{
   ofs.open("file.log");
   LOG(5) << "Test log 1" << std::endl;      // OK
   OtherFunc();
}

/// other.h
#ifndef OTHER_H
#define OTHER_H
extern int OtherFunc();
#endif

/// other.cpp
#include "other.h"
#include "log.h"
int OtherFunc()
{
   LOG(5) << "Test log 2" << std::endl;      // Nothing
}

生成されたファイルは次のとおりです。

5: Test log 1

ありがとうございました!

プラットフォーム:
Linux
g++ 4.5.1

4

3 に答える 3

5

静的グローバル変数:ソースファイルのトップレベル(関数定義の外)で静的として宣言された変数は、そのファイル全体でのみ表示されます(「ファイルスコープ」、「内部リンケージ」とも呼ばれます)。グローバル変数のデフォルトのストレージクラスは、extern外部またはプログラム全体のリンクを持っています。したがって、複数のファイルでグローバル変数を使用する場合は、次のようにする必要があります。extern.

于 2012-04-30T14:55:11.687 に答える
4

static fstream複数のソースファイルでを使用する必要があります。

複数のソースファイルから同じ変数を参照する必要がある場合、staticそれはリンケージではなく、externリンケージです。

これをヘッダーに入れてください:

extern std::ofstream ofs;

これをCPPファイルの1つに正確に入れてください。

std::ofstream ofs;
于 2012-04-30T14:54:09.597 に答える
4

staticstd::ofstream ofs here は、ファイル スコープ変数にstatic linkingを与えるようにコンパイラに明示的に要求していることを意味します。これは、現在のファイルにのみ表示されることを意味します。

ツイストは、ヘッダーでこれを行っていることです。つまり、.cppヘッダーを含むすべてのファイルは、std::ofstream ofs. 静的リンケージを指定したという理由だけで、それらはすべて同じ名前の個別のファイルスコープ変数を持つことができます。そうしないと、名前の衝突が発生します。

したがって、 ではmain.cpp、ローカルを開いてofs書き込みます。ではother.cpp、 の独自のローカル コピーがありますがofs、決して開かないでください。そのため、出力はどこにも行きませんfile.log


他の答えは正しいです。ヘッダー宣言を に変更するextern std::ofstream ofs;と、すべての.cppファイルが という単一のオブジェクトを共有できるようofsになり、インスタンスを正確に1つの場所に配置するだけで済みます(main.cpp問題ありません)。

LOG(level)ただし、行外の関数呼び出しを行う方が簡単でクリーンな場合があります。その後、出力ストリームはlog.cpp関数定義とともに存在する可能性があり、他の誰もそれを見る必要はありません。

于 2012-04-30T15:07:01.093 に答える