错误:粘贴“Java_com_my_packagename_myClass_myMethod”和“(”不提供有效的预处理令牌

时间:2013-08-30 22:02:52

标签: c++ boost precompiler

我正在编写一个宏,通过使用预处理器生成JNI方法名来简化生活:

#define JNI_WRAPPER_METHOD (className, methodName, returnValue, PARAMS) \
JNIEXPORT returnValue JNICALL Java_com_my_packagename_className_methodName\
(JNIEnv *env, jobject obj, BOOST_PP_SEQ_ENUM(PARAMS))

所以,理想情况是这样:

JNI_WRAPPER_METHOD(myClass, myMethod, jint, (jint myInt)(jstring myString))

会转化为:

JNIEXPORT jint JNICALL Java_com_my_packagename_myClass_myMethod(JNIEnv *env, jobject obj, jint myInt, jstring myString)

但是,当我尝试使用我的宏时,编译器会抛出以下错误:

错误:粘贴“Java_com_my_packagename_myClass_myMethod”和“(”不提供有效的预处理令牌

有谁知道宏为什么会失败?

1 个答案:

答案 0 :(得分:2)

你需要连接像:

这样的字符串
 Java_com_my_packagename_ ## className ## _ ## methodName

也不要在定义中留一个空格:

#define JNI_WRAPPER_METHOD(className, methodName, returnValue, PARAMS) 

总而言之,以下工作正常:

#define JNI_WRAPPER_METHOD(className, methodName, returnValue, PARAMS) \
        JNIEXPORT returnValue JNICALL                                  \
        Java_com_my_packagename_ ## className ## _ ## methodName       \
        (JNIEnv *env, jobject obj, BOOST_PP_SEQ_ENUM(PARAMS))