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

为什么这个C预处理器代码不工作?,c,c-preprocessor,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,ga

使用上述代码,我假设将创建具有以下签名的函数

#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_FINAL
移动到
GC_NATIVE_FUNCTION_DEF
之前

#define GC_NATIVE_FUNCTION_DEF(name,args) Java_com_mydomain_myapp_Game_##name args

void GC_NATIVE_FUNCTION_DEF(nativeFunc, (JNIEnv * env, jobject obj)) {
    ...
}
让我们把它通过预处理器<代码>gcc-E测试.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)) {
...
}
#1“test.h”
# 1 ""
# 1 ""
#1“/usr/include/stdc predef.h”1 3 4
# 1 "" 2
#1“测试h”
void Java_com_mydomain_myapp_Game_nativeFunc(JNIEnv*env,jobject obj){
...
}

还是不行。我相信,像我这样在宏中使用##有一些根本性的错误。有趣的阅读可以解释这种行为:
# 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) {
...
}