1

私たちの C/C++ プロジェクトは、Python スクリプトで利用できるようにするために SWIG のすべての関数を自由にラップする新しい内部スクリプトを使用しています。SWIG は可変個引数関数を適切にラップできないため、ロガー関数が詰まります。

そこで、SWIG がつまずくことのないマクロで可変個引数機能を非表示にすることにしました。以下の簡単な例をご覧ください。

#include <iostream>

void LogPrint(char *file, int line, char* msg)
{
    std::cout << file << ":" << line;
    std::cout << " [ " << msg << " ] ";
    std::cout << std::endl;
}

#define MAX_LOG 256

#define LogPrintf(msg, args...) \
{ \
    char *msg_buffer = new char[MAX_LOG]; \
    snprintf(msg_buffer, MAX_LOG, msg, ##args); \
    Log(__FILE__, __LINE__, msg_buffer); \
    delete [] msg_buffer; \
}

main()
{
    LogPrintf("%s = %f", "tau", 6.28318);
    LogPrintf("%s = %f", "pi", 3.14159);
}

これでいいですか?この問題に対するより良い解決策はありますか? ありがとう。

4

1 に答える 1

1

Python では、書式設定された文字列を Python 内で簡単に組み立てることができるため、単純な「文字列を渡してログに記録する」というエラーを提示するだけです。

ただし、一般的なケースでは、次のように考えることができます。

1) ブースト::フォーマット

std::stringstream2)メンバーを保持するクラスを作成し、オーバーロードして文字列ストリームoperator<<の に転送し、operator<<実際に「バッファ」の内容をログに記録する別の方法を追加して、iostream インターフェイスをエミュレートします (1 つの方法は、オブジェクトのデストラクタにログインすることです。コピー不可はおそらく良い考えです-したがって、次のようなことができますLogger() << "foo" << bar;-一時オブジェクトの有効期間が行の最後まで延長され、オペレーターのオーバーロードがバッファーの内容を構築し、dtor が実行され、文字列ストリーム.str()のどこへでも)。

于 2011-08-11T17:16:48.873 に答える