1

私はゲームを書いていますが、今のところ、クラスとそのメソッドを使用してファイルシステムを実装することができました。sqlite作業をより簡単にするために、、、、などの関数を記述して、基本関数をシャドウイングし、元の関数ではなくファイルシステムに呼び出しを送信できるようにすることを計画しましfopenた。最初の3つの関数では、これらのプロトタイプですべてが正常に機能しました。fclosefreadrename

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*とではないパラメータを返すのでこれはうまくFILE*いきましたが、rename関数は少しトリッキーなようです!

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. ヒューズ ファイル システム ドライバーを使用します (Linux/UNIX/MacOS の場合。やり過ぎかもしれませんが、実装する方がはるかに堅牢で、ここで行うことよりも簡単かもしれません)。
  2. Cマクロは常にあります(悪の場合-10ポイント)
  3. gnu リンカーには、リンク シンボルを「置換」できるオプションがあります - 主にデバッグ目的ですが、ここでそれらを活用できます
于 2011-06-16T10:13:59.127 に答える
3

ed バージョンrenameを呼び出すだけの標準的な署名でa を実装するのはどうですか?String

私には複雑に聞こえません。このようなもの:

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 に答える