C++ 我只能从一个文件访问静态流
我需要在多个源文件中使用C++ 我只能从一个文件访问静态流,c++,static,fstream,extern,C++,Static,Fstream,Extern,我需要在多个源文件中使用静态fstream。但是,我只能从一个文件中使用它,而不能从其他文件中使用它。此外,它在其他文件中的使用不会产生任何错误,它只是不做任何事情 代码如下: /// log.h #ifndef LOG_H #define LOG_H #include <fstream> static std::ofstream ofs; #define LOG(level) ofs << level << ": " #endif /// test.cpp
静态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
}
谢谢大家!
平台:Linux
g++4.5.1 我需要在多个源文件中使用
静态fstream
如果需要从多个源文件中引用同一变量,则这不是静态
链接,即外部
链接
把这个放在你的标题中:
extern std::ofstream ofs;
将此文件放在您的一个CPP文件中:
std::ofstream ofs;
静态全局变量:在源文件的顶层(在任何函数定义之外)声明为静态的变量仅在该文件中可见(“文件范围”,也称为“内部链接”)。
全局变量的默认存储类是
extern
,它具有外部或整个程序链接。因此,如果要在多个文件中使用全局变量,它必须是extern。
静态
这里的意思是明确要求编译器提供文件范围变量std::ofstream of s
静态链接,这意味着它只在当前文件中可见
扭曲之处在于,这是在一个头文件中进行的,这意味着每个.cpp
文件(包括头文件)都有自己的std::ofstreamofs
的独特实例。只有当您为它提供了静态链接时,它们才能具有具有相同名称的不同文件作用域变量,否则会出现名称冲突
因此,在main.cpp
中,您可以打开本地ofs
并对其进行写入。
在other.cpp
中,您拥有自己的ofs本地副本,但从未打开它。。。因此,输出不会到达任何地方,当然也不会到达file.log
其他答案是正确的,将头声明更改为
extern std::ofstream of s
将允许所有.cpp
文件共享一个名为ofs
的对象,然后只需将实例放在一个地方(main.cpp
就可以了)
让
LOG(level)
成为一个离线函数调用可能更简单、更干净;然后,输出流可以存在于带有函数定义的log.cpp
中,其他人不需要看到它。你说得对。我是为OtherFunc()做的,但我忘记了fstream。非常感谢。应该考虑制作<代码>日志()>代码>一个简单的旧函数。将所需状态(本例中为流)保留在函数实现的私有位置。这样,您就可以避免让所有使用它的人都知道流。关于您最后的评论,您关于使用.cpp文件实现记录器的看法是正确的,但我的是一种特殊情况,我必须将所有内容都放在一个包含文件中。@Pietro:如果所有内容都在一个包含文件中,其中是ofs的单个实例?
std::ofstream ofs;