1

代码:(在 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;
}

编译器错误:

系统 L7、C3:操作数类型不兼容。

到目前为止我做了什么:

  • 我没有任何 S_OK 的双重声明。

  • 我尝试评论 S_OK 枚举,编译器说unknown symbol 'S_OK'我在代码中写了 S_OK。

  • 我可以写SS_OK而不是S_OK它编译没有错误。

  • 我可以写S_OK = 0,出现同样的错误。

  • 我可以写S_OK, ...,出现同样的错误。

很高兴知道:

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


有人可以解释一下为什么编译器不想正确编译它吗?我不知道,这个错误对我来说似乎很奇怪(定义中的类型不兼容¯\_(ʘ ͟ʖʘ)_/¯)。

4

1 回答 1

1

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

  1. 投射S_OKlong
long func1() {
    return (long)S_OK;
}
  1. (首选)将返回类型更改为enum HRESULT_Types
enum HRESULT_Types func1() {
    return S_OK;
}

您还可以声明/定义与枚举类型关联的变量:

on timer Timer10ms {
    enum HRESULT_Types hr = S_OK; // instead of 'long hr = S_OK' if using option 2
    ....
}
于 2016-07-15T09:20:34.873 回答