gpt4 book ai didi

c++ - 是否可以使用宏来处理定义的内容?

转载 作者:行者123 更新时间:2023-11-28 03:45:49 25 4
gpt4 key购买 nike

我目前正在使用 JNI(Java native 接口(interface))在 Java 和 C++ 之间发送数据。在实现了一些代码之后,我意识到每种方法的代码总是相似的。一个例子可以是:

JNIEXPORT void JNICALL Java_com_trial_jni_Receiver_setData__II(JNIEnv * env, jobject thiz, jint nativeObject, jint value)  
{
reinterpret_cast<Receiver *>(nativeObject)->setData(value);
}

JNIEXPORT void JNICALL Java_com_trial_jni_Receiver_setData__ILjava_lang_String_2(JNIEnv *env, jobject thiz, jint nativeObject, jstring value)
{
reinterpret_cast<Receiver *>(nativeObject)->setData(value);
}

由于所有代码都具有相似的结构,我决定生成一组宏来自动生成所有这些代码。感谢 Gregory Pakosz 在这个链接中的回答 Is it possible to iterate over arguments in variadic macros?我现在能够使用预处理器验证我在宏中引入了多少参数并处理每个参数。

但是从前面的例子来看,有一件我无法实现但我想实现的事情。假设我在一个名为 JNI_METHOD 的宏中有这个方法。我想做这样的事情:

#define JNI_METHOD(package,clazz,method,...) \  
JNIEXPORT void JNICALL Java_ ##package## _ ##clazz## _ ##method##__II(JNIEnv * env, jobject thiz, jint nativeObject, SET_DECLARATION_PARAMS(__VA_ARGS__ )) \
{ \
reinterpret_cast<clazz *>(nativeObject)->method(SET_DECLARED_PARAMS(__VA_ARGS__)); \
}

JNI_METHOD(com_trial_jni,Receiver,setData,jint);
JNI_METHOD(com_trial_jni,Receiver,setData,jstring);

为了避免这个问题太长,我没有粘贴 SET_DECLARATION_PARAMS 和 SET_DECLARED_PARAMS 的声明,但第一个会导致类似“jint arg1”的内容,第二个在“arg1”中没有类型。

问题是:是否有任何方法可以生成一个为“jint”返回“I”或为“jstring”返回“Ljava_lang_String_2”的宏。请注意,不能使用字符串化,这需要在第二个生成的方法名称中使用“ILjava_lang_String_2”而不是“II”。

谢谢!

最佳答案

好吧,您提供的链接几乎可以为您提供所需的解决方案。考虑一下:

#define CONCATENATE(arg1, arg2)   CONCATENATE1(arg1, arg2)
#define CONCATENATE1(arg1, arg2) CONCATENATE2(arg1, arg2)
#define CONCATENATE2(arg1, arg2) arg1##arg2

#define JNI_TRANSLATE_TYPE_jint I
#define JNI_TRANSLATE_TYPE_jstring Ljava_lang_String_2

#define JNI_TRANSLATE_TYPE(T) CONCATENATE(JNI_TRANSLATE_TYPE_, T)

在 VS2010 上测试:

#define STRINGIZE(arg)  STRINGIZE1(arg)
#define STRINGIZE1(arg) STRINGIZE2(arg)
#define STRINGIZE2(arg) #arg

#pragma message("jint: " STRINGIZE(JNI_TRANSLATE_TYPE(jint)))
#pragma message("jstring: " STRINGIZE(JNI_TRANSLATE_TYPE(jstring)))

输出:

1>  jint: I
1> jstring: Ljava_lang_String_2

关于c++ - 是否可以使用宏来处理定义的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7761505/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com