[英]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.