2012-03-16 12 views
0

私は単純な問題のような気がしますが、解決方法を理解できないようです。私はAndroidに移植している大きなアプリケーションを持っています。ロギングのためのマクロの再定義

LOG_WARN(s_debugHandle, ("OpenGL error detected on entry. (Error:0x%x).",glError)); 

私は、AndroidとcombatibleするLOG_WARNを再定義したい:コードは、次のような多くのログコールが散らばっています。私がやったことは次のようになります。

#define LOG_WARN(handle, ...) __android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__) 

私はこれをコンパイルすると、コンパイラは、この私に語った:

error: invalid conversion from 'int' to 'const char*' 
error: initializing argument 3 of 'int __android_log_print(int, const char*, const char*, ...)' 

glErrorがintであるが、他の変数の型と他の呼び出しが同じ変換エラーを与えます代わりにそのタイプから。私は試してみました:

  1. は...交換し、ちょうど "MSG" のVA_ARGS。同じ問題。
  2. LOG_WARNの2番目の引数のかっこを削除します。これは実際にそれを解決しますが、それは他のプラットフォームのロギングマクロを壊すので私のケースでは有効な解決策ではありません。
  3. 1と2の両方とも、引数が多すぎると文句を言う。

助けてください!

UPDATE:

前処理した後、呼び出しは次のようになります。

__android_log_print(ANDROID_LOG_WARN, "debug", ("OpenGL error detected on entry. (Error:0x%x).",glError)); 
+0

プリプロセッサの出力を調べて、それが必要かどうか確認できますか? –

+0

完了し、質問を更新しました。 – Jake

+0

括弧を削除して他のプラットフォームのマクロを変更できますか? – Kevin

答えて

1

あなたは原始的な印刷の可変引数バージョンを使用して、独自の、中間の機能をインストールすることができます:

#include <cstdarg> 

void forward_debug(const char * fmt, ...) 
{ 
    std::va_list ap; 
    va_start(ap, fmt); 
    __android_log_vprint(ANDROID_LOG_WARN, LOG_TAG, fmt, ap); 
    va_end(ap); 
} 

#define LOG_WARN(ignore, x) forward_debug x 

更新:別のアイデアがあります:

#define SPLIT(...) __VA_ARGS__ 
#define LOG_WARN(ignore, x) __android_log_print(ANDROID_LOG_WARN, LOG_TAG, SPLIT x) 
+0

Splendid!これは素晴らしいです。ありがとうございます:-) – Jake

+0

来週はアップデートをお試しになります。 – Jake