You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 12:27:17