枚举 {...} 中的操作数类型不兼容 - 变量定义中的编译器错误?

Operand types are incompatible inside enum {...} - Compiler error in definition of variable?

代码:(运行 on CANoe 8.5.98 32bit)

/*@!Encoding:1252*/
includes {
}
variables {
    /* Windows HRESULT error type enum.                         */
    enum HRESULT_Types {
        S_OK            /* Operation successful                 */ = 0x00000000,
        S_FALSE         /* No error occured, oper. unsuccessful */ = 0x00000001,
        E_NOTIMPL       /* Not implemented                      */ = 0x80004001,
        E_NOINTERFACE   /* No such interface supported          */ = 0x80004002,
        E_POINTER       /* Pointer that is not valid            */ = 0x80004003,
        E_ABORT         /* Operation aborted                    */ = 0x80004004,
        E_FAIL          /* Unspecified failure                  */ = 0x80004005,
        E_UNEXPECTED    /* Unexpected failure                   */ = 0x8000FFFF,
        E_ACCESSDENIED  /* General access denied error          */ = 0x80070005,
        E_HANDLE        /* Handle that is not valid             */ = 0x80070006,
        E_OUTOFMEMORY   /* Failed to allocate necessary memory  */ = 0x8007000E,
        E_INVALIDARG    /* One or more arguments are not valid  */ = 0x80070057
    };
    msTimer Timer10ms;
}

on start {
    setTimer(Timer10ms, 10);
}

on timer Timer10ms {
    long hr = S_OK;
    hr = func1();
    if(hr == S_OK) {
        setTimer(Timer10ms, 10);
    }
}

long func1() {
    return S_OK;
}

编译器错误:

System L7,C3: operand types are incompatible.

到目前为止我做了什么:

小贴士:

我构建了一个 dll,它实现了 Windows API 到我的 CANoe 环境的一些功能。当然有 S_OK 的 typedef,但我无权访问任何其他 typedef 或全局变量,因为 CAPL dll 非常严格。这就是为什么我想实现这个简单的枚举。


谁能解释一下为什么编译器不想正确编译它?我不知道,这个错误对我来说太奇怪了(定义中的类型不兼容 ¯\_(ʘ ͟ʖʘ)_/¯)。

问题是func1()return是一个long,但是S_OK是一个枚举常量。因此出现错误“操作数类型不兼容”。以下是修复错误的两个选项:

  1. S_OK 转换为 long:
long func1() {
    return (long)S_OK;
}
  1. (首选)将 return 类型更改为 enum HRESULT_Types:
enum HRESULT_Types func1() {
    return S_OK;
}

您还可以 declare/define 与枚举类型关联的变量:

on timer Timer10ms {
    enum HRESULT_Types hr = S_OK; // instead of 'long hr = S_OK' if using option 2
    ....
}