c++预处理器中缀压缩宏函数值
C++ Preprocessor Infix Stingified Macro Function Value
我正在做一个相当大的基于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__)
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 在C++中将函数压缩为两种方式
- C++ 如何将数组值解压缩为函数参数
- 在解压缩可变参数模板时避免"recursive"函数调用,直到运行时条件
- 当构造函数采用自身时解压缩可变参数模板化类?
- 将一系列元组解压缩为 n 元函数
- 压缩C++函数调用语法
- Zlib解压缩函数复制而不是解压缩
- 如何创建一个在 C++11 (STL) 中压缩两个元组的函数
- 任何解压缩向量以在C++中函数参数的解决方案
- 将可变参数模板参数解压缩到数组中,应用每种类型的函数
- 如何在函数调用中解压缩模板参数
- 将boost gzip压缩器封装在易于使用的函数/类中
- 序列压缩函数用于c++ 11
- 解压缩存储为数组(目标:RPC)的可变模板函数调用的数据
- zlib解压缩函数导致程序崩溃
- 用C/ c++在Windows上解压缩内存函数