1

我正在编写一个游戏,现在我能够通过一个类及其方法来实现一个文件系统。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);

这工作得很好,因为我要么返回另一个结构或参数,除了 aFile*而不是 a FILE*,但是重命名函数似乎有点棘手!

int rename(String _OldFilename, String _NewFilename);

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

4

2 回答 2

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. 使用 fuse 文件系统驱动程序(在 Linux/UNIX/MacOS 上;可能是矫枉过正,但实现它似乎更健壮,甚至可能比你在这里做的更简单)。
  2. 总是有 C 宏(邪恶为-10 分)
  3. gnu 链接器具有让您“替换”链接符号的选项 - 主要用于调试目的,但您可以在此处利用这些选项
于 2011-06-16T10:13:59.127 回答
3

如何rename使用标准签名实现 a ,它将调用您的Stringed 版本?

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

int rename(const char *charOld, const char *charNew)
{
    std::string stdOld(charOld);
    std::string stdNew(charNew);
    return rename(stdOld, stdNew);
}
于 2011-06-16T10:10:30.210 回答