为什么这个C预处理器代码不工作


#define GC_APP_NAME_LIT myapp
#define GC_APP_DOMAIN_LIT mydomain
#define GC_NATIVE_FUNCTION_DEF(name,args) GC_NATIVE_FUNCTION_DEF_FINAL(GC_APP_DOMAIN_LIT,GC_APP_NAME_LIT,name,args)
#define GC_NATIVE_FUNCTION_DEF_FINAL(domain,game,name,args) Java_com_##domain_##game_Game_##name args
void GC_NATIVE_FUNCTION_DEF(nativeFunc, (JNIEnv * env, jobject obj)) {
    ...
}
使用上面的代码,我假设将创建一个具有以下签名的函数。
void Java_com_mydomain_myapp_Game_nativeFunc(JNIEnv * env, jobject obj)) {
    ...
}

但这似乎不起作用。

另一方面,这个设置的一个简单版本工作得很好。

#define GC_NATIVE_FUNCTION_DEF(name,args) Java_com_mydomain_myapp_Game_##name args
void GC_NATIVE_FUNCTION_DEF(nativeFunc, (JNIEnv * env, jobject obj)) {
    ...
}

…并创建所需的函数签名。

需要帮助确定我在这里做错了什么…

test.h

#define GC_APP_NAME_LIT myapp
#define GC_APP_DOMAIN_LIT mydomain
#define CONCAT(a,b,c,d,e,f) a ## b ## c ## d ## e ## f
#define GC_NATIVE_FUNCTION_DEF(name,args) GC_NATIVE_FUNCTION_DEF_FINAL(GC_APP_DOMAIN_LIT,GC_APP_NAME_LIT,name,args)
#define GC_NATIVE_FUNCTION_DEF_FINAL(domain,game,name,args) CONCAT(Java_com_, domain, _, game, _Game_, name) args
void GC_NATIVE_FUNCTION_DEF(nativeFunc, (JNIEnv * env, jobject obj)) {
...
}

让我们把它通过预处理器…gcc -E test.h:

# 1 "test.h"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "test.h"
void Java_com_mydomain_myapp_Game_nativeFunc (JNIEnv * env, jobject obj) {
...
}

我相信#define是按顺序处理的。尝试将GC_NATIVE_FUNCTION_DEF_FINAL 移动到 GC_NATIVE_FUNCTION_DEF之前。

最新更新