gpt4 book ai didi

c++ - C stdlib/stdio 的阴影函数

转载 作者:太空宇宙 更新时间:2023-11-03 10:34:40 24 4
gpt4 key购买 nike

我正在编写一个游戏,现在我能够通过 sqlite 使用一个类及其方法来实现一个文件系统。为了让生活更轻松,我计划编写一些函数,如 fopenfclosefreadrename 等. 能够隐藏基本功能并将我的调用定向到我的文件系统而不是原始文件系统。对于前三个函数,这些原型(prototype)对我来说一切正常:

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);

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

最佳答案

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

如果整个冲突都与重载决议有关,您应该简单地隐藏实际 原型(prototype);您可以将它们转发给您自己的函数。

但是,我建议不要采用这里的一般方法:即使有了该“修复”,您最多也会遇到排序问题,甚至可能出现重复的链接符号。

如果您的函数不这样做,请让它们使用另一个名称。由于您使用的是 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...

我很确定您仍然希望(需要)隐藏确切的函数原型(prototype)(否则编译器可能仍会提示不明确的标识符引用)。

其他提示:

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

关于c++ - C stdlib/stdio 的阴影函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6370171/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com