Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我只能从一个文件访问静态流_C++_Static_Fstream_Extern - Fatal编程技术网

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;