在令牌内使用已定义的常量

时间:2014-06-03 17:16:38

标签: c++ c c-preprocessor

我有一个功能列表:

JNIEXPORT void JNICALL Java_weber_droidtilla_DTActivity_staticInit(JNIEnv* env, jclass clazz);
JNIEXPORT void JNICALL Java_weber_droidtilla_DTActivity_gc(JNIEnv* env, jobject obj);
JNIEXPORT void JNICALL Java_weber_droidtilla_DTActivity_adjustExternalMemory(JNIEnv* env, jobject obj, jint bytes);
JNIEXPORT void JNICALL Java_weber_droidtilla_DTActivity_init(JNIEnv* env, jobject obj);
JNIEXPORT void JNICALL Java_weber_droidtilla_DTActivity_runScript(JNIEnv* env, jobject obj, jstring code, jstring name);
JNIEXPORT void JNICALL Java_weber_droidtilla_DTActivity_callFunction(JNIEnv* env, jobject obj, jstring name);
JNIEXPORT void JNICALL Java_weber_droidtilla_DTActivity_callFunctionD(JNIEnv* env, jobject obj, jstring name, jdouble d);

我正试图通过使用define

来摆脱一些重复
#define JNIFUNC JNIEXPORT void JNICALL Java_weber_droidtilla_DTActivity
JNIFUNC_staticInit(JNIEnv* env, jclass clazz);
JNIFUNC_gc(JNIEnv* env, jobject obj);
JNIFUNC_adjustExternalMemory(JNIEnv* env, jobject obj, jint bytes);
JNIFUNC_init(JNIEnv* env, jobject obj);
JNIFUNC_runScript(JNIEnv* env, jobject obj, jstring code, jstring name);
JNIFUNC_callFunction(JNIEnv* env, jobject obj, jstring name);
JNIFUNC_callFunctionD(JNIEnv* env, jobject obj, jstring name, jdouble d);

但是,这不会产生所需的输出,可能是因为JNIFUNC_something未被识别为对JNIFUNC的引用。

我能完成我想要的吗?

2 个答案:

答案 0 :(得分:2)

您的预处理程序指令会查找令牌JNIFUNC。令牌JNIFUNC_staticInit是完全不同的令牌,即使它包含相同的子串。您可以为JNIFUNC staticInit等函数添加空格而不是下划线,这将使预处理器替换令牌,但结果将是Java_weber_droidtilla_DTActivity staticInit(注意空格),这很可能导致语法错误

c ++解决方案是命名空间:

namespace Java_weber_droidtilla_DTActivity{
    void staticInit(...);
}

对于c你可以做这样的事情(也适用于c ++):

#define JNIFUNC(X) JNIEXPORT void JNICALL Java_weber_droidtilla_DTActivity_##X
JNIFUNC(staticInit)(JNIEnv* env, jclass clazz);

答案 1 :(得分:2)

C预处理器是一个简单的文本替换工具,但要替换的文本必须是一个完整的单词(在C符号的意义上)。如果您的宏JNIFUNC属于JNIFUNC_gc,则无法识别它。

您可以使用宏的标记粘贴语法##来创建新符号。在您的情况下,您可以定义:

#define JNIFUNC(name) JNIEXPORT void \
    JNICALL Java_weber_droidtilla_DTActivity_##name 

JNIFUNC(staticInit)(JNIEnv* env, jclass clazz);
JNIFUNC(gc)(JNIEnv* env, jobject obj);
JNIFUNC(adjustExternalMemory)(JNIEnv* env, jobject obj, jint bytes);

或者,如果您愿意更多地利用重复模式,您可以使用可变参数宏参数来摆脱第一对括号:

#define JNIFUNC(name, ...) JNIEXPORT void \
    JNICALL Java_weber_droidtilla_DTActivity_##name(JNIEnv *env, \
    __VA_ARGS__)

JNIFUNC(staticInit, jclass clazz);
JNIFUNC(gc, jobject obj);
JNIFUNC(adjustExternalMemory, jobject obj, jint bytes);