[英]Shadowing functions of C stdlib/stdio
我正在编写游戏,现在我可以通过sqlite
使用类及其方法来实现文件系统 。 为了使生活更轻松,我计划编写一些函数,例如fopen
, fclose
, fread
, rename
等,以便能够隐藏基本函数并将我的调用定向到文件系统而不是原始文件系统。 对于前三个功能,这些原型对我而言一切正常:
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...
我很确定您仍然会(需要)遮盖确切的函数原型(否则编译器可能仍会抱怨标识符引用不明确)。
其他提示:
如何用标准签名实现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.