罐藏 2023-03-30 01:13 采纳率: 100%
浏览 69
已结题

报错:①应输入表达式 ②不允许使用类型名

现象描述

算法源码出现的报错,具体如下

相关定义部分

#define VARS4UPDATE \
    __m128i k[2], state[S_NUM], stateNew[S_NUM], M[M_NUM];
#define INIT_STATE(key, iv) \
    k[0] = load(key + 16 * 0); \
    k[1] = load(key + 16 * 1); \
    state[0] = k[1]; \
    state[1] = load(iv); \
    state[2] = load(Z0); \
    state[3] = load(Z1); \
    state[4] = xor(state[1], state[0]); \
    state[5] = setzero(); \
    state[6] = k[0]; \
    state[7] = setzero(); \
    M[0] = state[2]; \
    M[1] = state[3]; \
    for (size_t i = 0; i < INIT_LOOP; ++i ) { \
        UPDATE_STATE(M) \
    } \
    state[0] = xor(state[0], k[0]); \
    state[4] = xor(state[4], k[1]);
#define COPY_FROM_LOCAL_IN_INIT(ctx) \
    COPY_FROM_LOCAL (ctx) for (size_t i = 0; i < 2; ++i) \
    { store(&(ctx -> key[i][0]), k[i]); }

报错函数部分

void rocca_init(rocca_context* ctx, const uint8_t* key, \
    const uint8_t* iv) {
    VARS4UPDATE
    INIT_STATE(key, iv);                // 报错:应输入表达式
    COPY_FROM_LOCAL_IN_INIT(ctx);       // 报错:不允许使用类型名
    ctx->size_ad = 0;
    ctx->size_m = 0;
}

初步分析

第一次遇到使用多行定义的情况,查了一下找到两种可能原因。

  1. 定义语句末尾加了分号导致的,于是将多行定义最后一行末尾的分号去掉,结果同原报错;
  2. 是看到使用多行定义的大多使用 {...}do{...} while(0)将定义内容括起来,尝试后结果同原报错。

怀疑过可能是 _m128i 的问题,查阅 Microsoft Learn,只说明了“ARM 处理器不支持 __m128i 数据类型”。

运行环境

  • Visual Studio 2019
  • Windows 10
  • Intel(R) Core(TM) i5-8265U CPU @ 1.60GHz 1.80 GHz
  • x64
  • 写回答

3条回答 默认 最新

  • threenewbee 2023-03-30 06:24
    关注

    这些都是宏展开
    你先直接写展开后的代码,看哪一行报错。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月8日
  • 已采纳回答 3月31日
  • 创建了问题 3月30日

悬赏问题

  • ¥15 孟德尔随机化结果不一致
  • ¥15 深度学习残差模块模型
  • ¥50 怎么判断同步时序逻辑电路和异步时序逻辑电路
  • ¥15 差动电流二次谐波的含量Matlab计算
  • ¥15 Can/caned 总线错误问题,错误显示控制器要发1,结果总线检测到0
  • ¥15 C#如何调用串口数据
  • ¥15 MATLAB与单片机串口通信
  • ¥15 L76k模块的GPS的使用
  • ¥15 请帮我看一看数电项目如何设计
  • ¥23 (标签-bug|关键词-密码错误加密)