C++宏编译报错pasting "->"和"object"无有效预处理令牌如何解决
错误原因
##是C/C预处理器提供的令牌拼接运算符,作用是将两个预处理器片段合并为单个合法的预处理器令牌,拼接结果必须符合C令牌规范才能通过编译。
原代码的问题出在return environment-> ## fieldAccessorNamePrefix ## FieldAccessor->getValue(...)这一行:
->本身是独立的成员访问运算符令牌,和后面的成员名属于两个独立的语法单元,不需要做拼接- 此处多余的
##会尝试把->和宏参数fieldAccessorNamePrefix展开后的object拼接成->object,这不是合法的C++预处理器令牌,直接触发编译报错。
修复方案
移除->后面多余的##拼接符即可。->和后续成员名不需要拼接,预处理器会正常完成参数替换,自动将fieldAccessorNamePrefix和紧跟的FieldAccessor拼接为合法的成员标识符。
修复后可正常编译的代码
#define FIELD_ACCESSOR_FUNCTIONS(typeName, fieldAccessorNamePrefix) \ JNIEXPORT jobject JNICALL my_pckg_NativeExecutor_get ## typeName ## FieldValue(JNIEnv* jNIEnv, jobject nativeExecutorInstance, jobject target, jobject field) { \ return environment->fieldAccessorNamePrefix ## FieldAccessor->getValue(jNIEnv, target, field); \ } FIELD_ACCESSOR_FUNCTIONS(Object, object)
宏展开后的等价代码如下,完全符合C++语法要求:
JNIEXPORT jobject JNICALL my_pckg_NativeExecutor_getObjectFieldValue(JNIEnv* jNIEnv, jobject nativeExecutorInstance, jobject target, jobject field) { return environment->objectFieldAccessor->getValue(jNIEnv, target, field); }
内容的提问来源于stack exchange,提问作者JulesF
相关产品推荐
相关产品推荐

