2013年1月24日木曜日

PREPROCESSOR と enum

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 件のコメント: