C ++预处理器中缀加固宏功能值

时间:2015-10-08 10:23:02

标签: c++ macros c-preprocessor

我正在开发一个相当大的基于JNI的项目。 JNI需要某些 C 函数名来匹配相关的JAVA函数名。我正在谈论的例子:

Example.java

package com.example.app;
...
class Example {
    public static native void doSomething();
}

Example.c

JNIEXPORT void JNICALL Java_com_example_app_Example_doSomething(...) {...}

我正在使用宏来简化表示法:

#define J_DEF(name, ...) JNIEXPORT void JNICALL Java_com_example_app_Example_##name(..., __VA_ARGS)

但是当我尝试将宏中的..com_example_app...部分替换为另一个宏返回值时,我遇到了一个问题:

#define J_PACKAGE(separator) "com" separator "example" separator "app"
#define J_DEF(name, ...) JNIEXPORT void JNICALL Java_##J_PACKAGE("_")##_##name(..., __VA_ARGS)

有没有正确模拟语法,我写过?它似乎不起作用。

P.S。我也将J_PACKAGE宏用于代码的其他部分,只是使用不同的分隔符。

示例1

#define J_DEF(name, ...) JNIEXPORT void JNICALL Java_com_example_app_Example_##name(JNIEnv* env, jobject obj, __VA_ARGS__)

J_DEF(myFunction); // generates: JNIEXPORT void JNICALL Java_com_example_app_Example_myFunction(JNIEnv* env, jobject obj);
J_DEF(myFunction, int x); // generates: JNIEXPORT void JNICALL Java_com_example_app_Example_myFunction(JNIEnv* env, jobject obj, int x);

示例2

#define J_PACKAGE(separator) "com" separator "example" separator "app"
#define J_DEF(name, ...) JNIEXPORT void JNICALL Java_##J_PACKAGE(_)##_##name(JNIEnv* env, jobject obj, __VA_ARGS__)

J_DEF(myFunction); // generates: void  Java_J_PACKAGE(_)_myFunc(JNIEnv* env, jobject obj  );
// instead I need to generate JNIEXPORT void JNICALL Java_com_example_app_Example_myFunction(JNIEnv* env, jobject obj);

1 个答案:

答案 0 :(得分:0)

我认为这可以解决您的问题:

#define J_PACKAGE(sep) com ## sep ## example ##  sep ##  app
#define JDEF2(A, B) JNIEXPORT void JNICALL java_##A##_##B
#define JDEF1(A, B)  JDEF2( A, B)
#define J_DEF(C, ...) JDEF1( J_PACKAGE(_), C) (JNIEnv* env, jobject obj, __VA_ARGS__)