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

现象描述

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

相关定义部分

#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

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

1.UPDATE_STATE(M) \这一行缺少分号
2.COPY_FROM_LOCAL (ctx)这是个啥

不知道你这个问题是否已经解决, 如果还没有解决的话:


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^