为什么这个C预处理器代码不起作用?

时间:2014-08-22 14:44:32

标签: c c-preprocessor

#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)) {
    ...
}

。 。 。并根据需要创建函数签名。

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

2 个答案:

答案 0 :(得分:3)

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) {
...
}

答案 1 :(得分:0)

我相信#define会按顺序处理。尝试在 GC_NATIVE_FUNCTION_DEF_FINAL之前移动GC_NATIVE_FUNCTION_DEF