2011-08-11 8 views
1

私たちのC/C++プロジェクトでは、SWIG内のすべての関数を自由にラップしてPythonスクリプトを利用できる新しい内部スクリプトを使用しています。 SWIGは可変的な関数をうまく包むことができないので、私たちのロガー関数を窒息させます。可変ではないprintf形式のロガー

だから私は、下記の簡略化した例に示す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); 
} 

この大丈夫ですか?この問題の解決策はありますか?ありがとう。

+0

C/C++のようなものはなく、どちらもvariadicマクロに関して本当に異なっています。あなたのコードはC++ですが、あなたはCであなたの質問にタグを付けています。一つを選択するか、あなたが探しているものをより良く説明してください。 –

答えて

2

Pythonでは、Python内で書式設定された文字列を組み立てるのが簡単なので、単純な「文字列を与えてログに記録する」というエラーを表示します。

一般的なケースでは、しかし、あなたは考えるかもしれません:

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

2)に転送するoperator<<をオーバーロード、std::stringstreamメンバーを保持するクラスを作成することにより、iostreamのインタフェースをエミュレートします文字列ストリームのoperator<<を追加し、実際に "バッファ"の内容を記録する別の方法を追加します(1つのアプローチはオブジェクトのデストラクタにログインすることです - コピーできないようにすることはおそらく良いアイデアなのでLogger() << "foo" << bar; - 一時的なオブジェクトの存続期間はラインの終わりまで拡張され、オペレータのオーバーロードはバッファ内容を構築するdtorが実行され、文字列ストリームの.str()がすべてに出力されます)。

+0

さまざまなオプションをありがとう。良いアイデア。 –

関連する問題