文字列操作の一部をショートカットするために探しているこのロギングシステムがあります。
ロギングシステムは、機能マクロを介して使用され、その後、単一の関数呼び出しに転送されます。例#define Warning(...) LogMessage(eWarning, __VA_ARGS__);
:
次に、LogMessageはsnprintf
新しいバッファに対してを実行し、インストールされているログターゲットにそのメッセージを表示します。printf、OutputDebugStringなど。
残念ながら、私たちが持っているバッファが十分に大きくないという問題に遭遇したので、出力が切り捨てられます。また、snprintfがva_argsを処理しようとするため、出力メッセージにパーセント記号が含まれている場合、このメソッドは失敗することに気付きました。最後に、ログメッセージの大部分はva_argsを使用しないため、文字列をコピーしてロガーに提示するのはばかげているようです。
それで、私の関数プロトタイプを考えると、楕円の存在に基づいてオーバーロードできるはずですか?言い換えれば、私は次のようなことができると仮定できるはずです:
LogMessage(LogLevel, const char* message, ...);
LogMessage(LogLevel, const char* message);
私のグーグルの試みは特に有用なものを何も生み出しませんでした(他に何も一致しない場合は省略記号が一致することを示し、何も一致しないという私の要件とは異なります)、実装での最初の刺し傷はあいまいな関数呼び出しエラーを私に与えました。
エラーがあるので、これはできないことを受け入れる必要がありますが、それが使用しているコンパイラだけなのか、それとも間違っているのか疑問に思っています。私は同様の効果を達成することができます
// edited version of what I really have to remove our local APIs,
// please excuse minor errors
const char* message = NULL;
char buffer[512];
va_list args;
va_start(args, format);
if(strcmp(format, "%s") == 0) {
message = va_arg(args, const char*);
}
else if (strchr(format, '%') == NULL) {
message = format;
}
else {
vsnprintf(buffer, 512, format, args);
message = buffer;
}
va_end(args);
...しかし、これは、渡されるパラメータの数だけで知ることができる典型的なケースでは無駄に思えます。たとえば、省略記号が何にも一致しない場合は、他の関数を選択しますか?これが機能しない場合、どの関数を呼び出すかをユーザーがマクロ名で決定する必要がない、私が試すことができる別の方法はありますか?正直なところ、誰かError("Buffer not 100% full");
がログメッセージで無計画に言って、結果として「Buffer not 1007.732873e10ull」を受け取った場合、「無駄」についてはそれほど重要ではありません。
編集:私の例は「それをしないでください」によって答えられましたが、質問自体は答えることができますか?