我需要在多个源文件中使用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
答案 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
中,而其他任何人都不需要来查看它。