android ndk を使っていて
ログを出力するかどうか、プリプロセッサで制御しとこうと思い
#include <boost/preprocessor/comparison/greater_equal.hpp>
#include <jni.h>
#include <android/log.h>
#define LOG_LEVEL ANDROID_LOG_INFO
void hoge () {
# if BOOST_PP_GREATER_EQUAL(ANDROID_LOG_DEBUG,LOG_LEVEL)
__android_log_print(ANDROID_LOG_DEBUG, "HOGE", "hoge");
# endif
...
}
なんてやったら、
記述 リソース パス ロケーション タイプ
missing binary operator before token "BOOST_PP_IIF_BOOST_PP_BOOL_ANDROID_LOG_INFO"
なんてエラーになったんですわ。ほぇ???
android/log.h を見たら
/*
* Android log priority values, in ascending priority order.
*/
typedef enum android_LogPriority {
ANDROID_LOG_UNKNOWN = 0,
ANDROID_LOG_DEFAULT, /* only for SetMinPriority() */
ANDROID_LOG_VERBOSE,
ANDROID_LOG_DEBUG,
ANDROID_LOG_INFO,
ANDROID_LOG_WARN,
ANDROID_LOG_ERROR,
ANDROID_LOG_FATAL,
ANDROID_LOG_SILENT, /* only for SetMinPriority(); must be last */
} android_LogPriority;
ははーん、enum は、あくまで enum なんで、プリプロセッサでは integer として展開されないんですね。
という訳で、
#define M_ANDROID_LOG_UNKNOWN 0
#define M_ANDROID_LOG_DEFAULT 1 /* only for SetMinPriority() */
#define M_ANDROID_LOG_VERBOSE 2
#define M_ANDROID_LOG_DEBUG 3
#define M_ANDROID_LOG_INFO 4
#define M_ANDROID_LOG_WARN 5
#define M_ANDROID_LOG_ERROR 6
#define M_ANDROID_LOG_FATAL 7
#define M_ANDROID_LOG_SILENT 8 /* only for SetMinPriority(); must be last */
#define LOG_LEVEL M_ANDROID_LOG_INFO
として、定数は、M_ 付きにしました。だっせー。
まぁ、template メタ関数にして回避しても良いんですけどね…
0 件のコメント:
コメントを投稿