我認爲我終於明白你想要達到的目標。您想要從兩個不同的源文件(翻譯單元)訪問一個流。我認爲,由於你是C++的新手,我應該建議最簡單的解決方案。請不要認爲它是最好的,因爲它有很多警告。我們有項目包含三個源文件:foo1.cpp
,foo2.cpp
,main.cpp
:
文件foo1.cpp
#include <fstream>
extern std::ofstream logger;
void foo1()
{
logger << "Foo1 started" << std::endl;
//some stuff
logger << "Foo1 finished" << std::endl;
}
文件foo2.cpp
#include <fstream>
extern std::ofstream logger;
void foo2()
{
logger << "Foo2 started" << std::endl;
//some stuff
logger << "Foo2 finished" << std::endl;
}
文件main.cpp中
#include <fstream>
#include <iostream>
std::ofstream logger;
void foo1();
void foo2();
int main()
{
logger.open("./data.txt", std::ios::app);
foo1();
foo2();
logger.close();
}
此代碼希望完全編譯和一個壓腳提升執行會有一個文件data.txt
與此內容: Foo1開始 Foo1完成 foo2的開始 foo2的完成
我認爲最有趣的,你應該從main.cpp
行和第三行,第四行foo1.cpp
和foo2.cpp
。
main.cpp
的第四行,因爲記錄器是在main
函數之外聲明的,這允許其他函數到達記錄器並使用它。這不僅適用於此.cpp
文件中的功能。編譯器會將地址放在符號表中的這個變量的.o
文件中,這正是我的意圖。您可以嘗試在其之前添加static
關鍵字,並查看會發生什麼情況。 (這將禁用此行爲)從foo1.cpp
和foo2.cpp
三線通知編譯器會出現這樣的變量(它會立刻它的名稱和類型)中的一些.o
(在我們的例子main.o
)符號表。編譯器將生成使用此類變量的代碼,並將在符號表中放置此文件需要提供此類變量(即未定義符號)。
如果你設法瞭解這一點,你也可以使用自己的頭文件。這個「項目」中有某種重複。foo1.cpp
和foo2.cpp
的前三行完全相同。你可能想使用頭文件來減少這個。
logger.hpp:
#include <fstream>
extern std::ofstream logger;
foo1.cpp:
#include "logger.hpp"
void foo1()
{
...
foo2.cpp
#include "logger.hpp"
void foo2()
{
...
文件通常只用於此的頭,保持接口在一個地方的其他源文件,除了在線功能和模板。如果你曾經想過將它用於別的東西,請再考慮一下
你還沒有提供足夠的代碼來知道發生了什麼,但我會冒險猜測。嘗試在頂部添加'#include'並將'std ::'放在你使用它之前:'std :: ofstream myfile;' –
Galik
2015-02-08 11:18:35