c++预处理器中缀压缩宏函数值

C++ Preprocessor Infix Stingified Macro Function Value

本文关键字:函数 压缩 中缀 预处理 处理器 c++      更新时间:2023-10-16

我正在做一个相当大的基于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)

有什么方法可以正确地模拟我写的语法吗?它似乎不工作。

注:对于代码的其他部分,我也使用了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);

我想这会解决你的问题:

#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__)