C++ 文件*作为公共文件

C++ 文件*作为公共文件,c++,c,C++,C,我再次在此寻求支持 例如,我有一个叫做fp的fopen东西 FILE * fp; fp=fopen("Entity.dat","wb"); 我有x函数,需要在所有函数中使用它,所以问题是我如何将其公开/全局范围 您应该使用extern: _文件.h #ifndef FILE_H #define FILE_H ... extern FILE *file; #endif _file.cpp #include "file.h" FILE *file; 然后打开文件并将句柄存储在文件中。

我再次在此寻求支持

例如,我有一个叫做fp的fopen东西

FILE * fp;

fp=fopen("Entity.dat","wb");
我有x函数,需要在所有函数中使用它,所以问题是我如何将其公开/全局范围

您应该使用extern:

_文件.h

#ifndef FILE_H
#define FILE_H

...

extern FILE *file;

#endif
_file.cpp

#include "file.h"

FILE *file;

然后打开文件并将句柄存储在文件中。下一步,你可以使用你需要的文件。

如果你有选择,请把它作为参数传递,如果你真的没有任何选择,那么你可以考虑SuntLon。

c++11

c++98

你可以这样使用它

#include <cstdio>

template<typename T>
class meyersSingleton
{
public:
  static T& instance()
  {
    static T theSingleton;
    return theSingleton;
  }

  meyersSingleton() = delete;
  ~meyersSingleton() = delete;
  meyersSingleton(meyersSingleton const&) = delete;
  meyersSingleton& operator=(meyersSingleton const&) = delete;

};

void read_file()
{
    char buffer [100];
    fgets (buffer , 100 , meyersSingleton<FILE*>::instance());
    printf("%s", buffer);    
}

int main()
{             
    FILE **a = &meyersSingleton<FILE*>::instance();
    *a = fopen("coeff", "rb");

    read_file();   

    return 0;
}
这不是一个非常直观的解决方案,但它将保证您只有一个全局和单个文件

如果需要更多的单个文件,可以再添加一个模板参数

template<typename T, size_t N = 0>
class meyersSingleton
{
public:
  static T& instance()
  {
    static T theSingleton;
    return theSingleton;
  }

  meyersSingleton() = delete;
  ~meyersSingleton() = delete;
  meyersSingleton(meyersSingleton const&) = delete;
  meyersSingleton& operator=(meyersSingleton const&) = delete;

};
如果您使用的是c,那么只需省略此解决方案

编辑:在大多数情况下,singleton被认为是一个糟糕的解决方案,一个反模式 这里有一些讨论单身汉利弊的好文章

别误会我的意思,单身汉解决一个问题保证你只有一个问题 objectvariable,resource,无论什么时候,有时这都是非常有用的,尽管它
很少见。Log就是一个例子,我们到处都需要Log,而Log不会写入我们的程序中。

理想情况下,您只需将它作为参数传递给需要使用它的任何函数:

void func( FILE *f, ... )
{
  // do something with f
}

int main( void )
{
  FILE *fp = fopen( "Entity.dat", "wb" );
  ...
  func( fp, ... );
  ...
}

不要。将其作为参数传递,最好是在将其验证为非NULL之后。因为我们抽的是相同的东西。。。如果无法将文件描述符传递给函数,则应该能够在头中声明它。但我不知道如何把它放在主机外面,无法做到这一点。为什么如果你在C中工作的话,为什么这个标签是C++?在C.的情况下,在函数作用域之外声明它,但是我不明白为什么你不能把它作为输入输入到X函数中。此外,似乎变量只需要在单个或有限的范围内可见。我知道这不是最好的答案,但反对票怎么办?与否决投票相比,更喜欢评论和编辑发生了什么?但是,说真的,@steromating,你必须解释使用单例如何解决OP的问题,而不是仅仅说明如何实现单例。-1:单例很少需要,经常被滥用,在这种情况下,它们增加了复杂性而没有任何好处。我不认为让初学者找到不合适的解决方案是个好主意。我能提出的唯一改进答案的建议是删除它另一种选择是扩展它来解释为什么单身在这里不是一个好的选择,但这远远超出了原始问题的范围。打开文件并将句柄分配给main或任何其他函数中的“file”?你能澄清一下吗?这取决于编程人员的决定,例如,他可以先在main中打开它,然后再在main中打开它。
template<typename T, size_t N = 0>
class meyersSingleton
{
public:
  static T& instance()
  {
    static T theSingleton;
    return theSingleton;
  }

  meyersSingleton() = delete;
  ~meyersSingleton() = delete;
  meyersSingleton(meyersSingleton const&) = delete;
  meyersSingleton& operator=(meyersSingleton const&) = delete;

};
void func( FILE *f, ... )
{
  // do something with f
}

int main( void )
{
  FILE *fp = fopen( "Entity.dat", "wb" );
  ...
  func( fp, ... );
  ...
}