ошибка: вставка & quot; Java_com_my_packagename_myClass_myMethod & quot; и «(» не дает действительный токен предварительной обработки

Я пишу макрос, чтобы сделать жизнь проще, генерируя имена методов 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» и «(» не дает действительный токен предварительной обработки

Кто-нибудь знает, почему не работает макрос?

0

Решение

Вам нужно объединить строки, такие как:

 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))
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]