我只能从一个文件访问静态fstream

时间:2012-04-30 14:47:50

标签: c++ static fstream extern

我需要在多个源文件中使用static fstream。但是我只能从单个文件中使用它,而不能从其他文件中使用它。此外,它在其他文件中的使用不会产生任何错误,它只是什么都不做。

这是代码:

/// 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

3 个答案:

答案 0 :(得分:4)

静态全局变量:在源文件的顶层(在任何函数定义之外)声明为static的变量仅在整个文件中可见(“文件范围”,也称为“内部链接”)。 全局变量的默认存储类是extern,它具有外部或整个程序链接。因此,如果要在多个文件中使用全局变量,则必须为extern.

答案 1 :(得分:3)

  

我需要在多个源文件中使用static fstream

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

将它放在标题中:

extern std::ofstream ofs;

将其放在您的一个CPP文件中:

std::ofstream ofs;

答案 2 :(得分:3)

static这里意味着您明确要求编译器提供文件范围变量std::ofstream ofs 静态链接,这意味着它只能 在当前文件中。

扭曲是你在标题中这样做,这意味着包含标题的每个.cpp文件都有自己独特的std::ofstream ofs实例。只是因为你已经给它静态链接,它们都有不同的文件范围变量,名称相同 - 否则就会出现名称冲突。

因此,在main.cpp中,您打开本地ofs并写信给它。 在other.cpp中,您拥有自己的ofs本地副本,但从不打开它...因此输出不会发送到任何地方,当然也不会发送到file.log


其他答案是正确的,将标头声明更改为extern std::ofstream ofs;将允许所有.cpp个文件共享一个名为ofs的对象,然后您只需要将恰好在一个地方的实例(main.cpp会好的。)

尽管使LOG(level)成为一个外联函数调用可能更简单,更简洁;那么输出流可以存在于具有函数定义的log.cpp中,而其他任何人都不需要来查看它。