繁体   English   中英

C stdlib / stdio的阴影功能

[英]Shadowing functions of C stdlib/stdio

我正在编写游戏,现在我可以通过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吗?

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

如果整个冲突都与重载解决方案有关,则您只需要遮盖实际的原型即可; 您可以使它们转发到您自己的功能。

但是,我建议您不要采用这种通用方法:即使设置了该“修复程序”,您最多也将遇到订购问题,甚至可能出现重复的链接符号。

如果您的功能不同,请使用其他名称。 由于您使用的是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链接器具有让您“替换”链接符号的选项-主要用于调试目的,但是您可以在此处利用这些符号

如何用标准签名实现rename ,该rename将调用您的String ed版本?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM