C stdlib / stdio的阴影函数

时间:2011-06-16 10:05:34

标签: c++ file-io stdio std shadowing

我正在编写游戏,现在我能够通过sqlite使用类及其方法实现文件系统。为了让生活更轻松,我计划编写一些函数,如fopenfclosefreadrename等,以便能够隐藏基本函数并指导我对文件系统的调用而不是对原始文件系统的调用。对于前三个功能,一切都适合我使用这些原型:

  

File *fopen(String _Filename, String _Mode); // i have my own optimized File struct

     

void fclose(File *_File);

     

size_t fread(String *_DstBuf, size_t _ElementSize, size_t _Count, File *_File);

这个工作正常,因为我要么返回另一个结构或除了File*而不是FILE*之外的参数,但重命名函数似乎有点棘手!

  

int rename(String _OldFilename, String _NewFilename);

这几乎是相同的原型。除了我使用std::string(typedef'ed String)而不是const char*!知道我怎么能说服我的编译器使用我的函数或忽略stdio-one?

2 个答案:

答案 0 :(得分:5)

你不能简单地使用任何其他名称的自己的函数是什么原因?

如果整个冲突都是重载解决方案,那么你应该只是隐藏实际的原型;你可以将它们转发到你自己的职能部门。

但是,我建议不要使用这里的一般方法:即使使用“修复”,您最好还是包括订购问题,甚至可能包含重复的链接符号。

如果您的功能不相同,请使用其他名称。由于你使用的是c ++,你可以在MyFsFunctions.h中做这个恶意技巧(否则是不明智的):

namespace MyFsFunctions 
{
     // prototypes for fopen, fclose, fwrite, fread etc
}

using namespace MyFsFunctions;
// or:
using MyFsFunctions::fopen;
using MyFsFunctions::fclose;
using MyFsFunctions::fread;
using MyFsFunctions::fwrite; // etc...

我很确定你仍然希望(需要)隐藏确切的函数原型(或者编译器可能仍会抱怨模糊的标识符引用)。

其他提示:

  1. 使用保险丝文件系统驱动程序(在Linux / UNIX / MacOS上;可能过度,但实现它似乎更强大,甚至可能比你在这里做的更简单)。
  2. 总有C宏(邪恶的-10分)
  3. gnu链接器有让你“替换”链接符号的选项 - 主要用于调试目的,但你可以利用这些

答案 1 :(得分:3)

如果使用标准签名实施rename,它所做的就是调用您的String版本?

对我来说听起来并不复杂。像这样:

int rename(const char *charOld, const char *charNew)
{
    std::string stdOld(charOld);
    std::string stdNew(charNew);
    return rename(stdOld, stdNew);
}