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在多个源文件中使用 a 。

如果你需要从多个源文件中引用同一个变量,那不是static链接,那是extern链接。

把它放在你的标题中:

extern std::ofstream ofs;

将其放入您的 CPP 文件之一中:

std::ofstream ofs;
于 2012-04-30T14:54:09.597 回答
4

static这意味着您明确要求编译器提供文件范围变量std::ofstream ofs static links,这意味着它在当前文件中可见。

不同之处在于您在标头中执行此操作,这意味着.cpp包括标头在内的每个文件都有自己独特的std::ofstream ofs. 仅因为您已为其提供静态链接,它们才能具有具有相同名称的不同文件范围变量 - 否则会出现名称冲突。

因此,在 中main.cpp,您打开本地ofs并写入它。在other.cpp中,您有自己的本地副本ofs,但从不打开它......所以输出不会去任何地方,当然也不会去file.log.


其他答案是正确的,将标头声明更改为extern std::ofstream ofs;将允许所有.cpp文件共享一个名为 的对象ofs,然后您只需将实例放在一个位置(main.cpp就可以了)。

LOG(level)不过,进行离线函数调用可能更简单、更清晰;然后输出流可以log.cpp与函数定义一起存在,其他人不需要看到它。

于 2012-04-30T15:07:01.093 回答