簡體   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