【问题标题】:error C2227: left of '->yr' must point to class/struct/union/generic type错误 C2227:“->yr”的左侧必须指向类/结构/联合/通用类型
【发布时间】:2019-09-09 20:39:55
【问题描述】:

我正在为 WinCE 编写加密/解密程序。

当我编译程序时,我得到如下错误: 错误 C2227:'->yr' 的左侧必须指向类/结构/联合/通用类型

sn-p 是:

void ai(struct AES_ctx* ctx, const uint8_t* key)
{
  k(ctx->yr, key);
}

以及对应的header sn-p:

#define AES_BLOCKLEN 16
#define AES_KEYLEN 32
#define AES_keyExpSize 240

struct AES_ctx
{
  uint8_t yr[AES_keyExpSize];
  uint8_t Iv[AES_BLOCKLEN];
};

void ai(struct AES_ctx* ctx, const uint8_t* key);

使用 StandardSDK_500 ARMv4I 编译器工作正常,但使用 MIPSII 我得到了这个。

谁能帮忙解决这个错误?

【问题讨论】:

  • 也许是ai(AES_ctx* ctx
  • 我无法让这个错误出现在这个 sn-p 中。你确定它在那条线上?其余的错误是什么(应该有note: type is 'const uint8_t *'之类的东西)。当您尝试将 -> 与指向非类类型的指针一起使用时,就会发生这种情况。

标签: c++ encryption visual-studio-2005


【解决方案1】:

您的代码没有任何问题:它编译得很好。

(如果ctx 是一个宏,定义在一些#included 头文件中,则此代码可能会产生各种错误,包括您报告的错误,这可能取决于编译器;使用#ifdef ctx ... 进行测试)

您可能想要运行预处理器(通常使用选项-E)并查看生成的代码。

(顺便说一句,在 C++ 中,这看起来更像

namespace AES {
    constexpr int blocklen=16;
    constexpr int keylen=32;
    constexpr int keyExpSize=240;

    struct ctx {
        std::uint8_t yr[keyExpSize];
        std::uint8_t Iv[blocklen];
    };
    // etc
}

即没有宏,没有全局命名空间的污染。)

【讨论】:

  • 是的,ARM编译器没有问题。 MIPSII 这样做,我不明白为什么
  • std::array 请!
  • @LightnessRacesinOrbit 这只是最低限度的'加分':-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多