枚举 {...} 中的操作数类型不兼容 - 变量定义中的编译器错误?
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.
到目前为止我做了什么:
我没有S_OK的双重声明。
我尝试注释 S_OK 枚举,编译器在我在代码中写 S_OK 的任何地方都说 unknown symbol 'S_OK'
。
我可以写 SS_OK
而不是 S_OK
并且编译没有错误。
我可以写S_OK = 0
,出现同样的错误。
我可以写S_OK, ...
,出现同样的错误。
小贴士:
我构建了一个 dll,它实现了 Windows API 到我的 CANoe 环境的一些功能。当然有 S_OK 的 typedef,但我无权访问任何其他 typedef 或全局变量,因为 CAPL dll 非常严格。这就是为什么我想实现这个简单的枚举。
谁能解释一下为什么编译器不想正确编译它?我不知道,这个错误对我来说太奇怪了(定义中的类型不兼容 ¯\_(ʘ ͟ʖʘ)_/¯
)。
问题是func1()
return是一个long
,但是S_OK
是一个枚举常量。因此出现错误“操作数类型不兼容”。以下是修复错误的两个选项:
- 将
S_OK
转换为 long
:
long func1() {
return (long)S_OK;
}
- (首选)将 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
....
}
代码:(运行 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.
到目前为止我做了什么:
我没有S_OK的双重声明。
我尝试注释 S_OK 枚举,编译器在我在代码中写 S_OK 的任何地方都说
unknown symbol 'S_OK'
。我可以写
SS_OK
而不是S_OK
并且编译没有错误。我可以写
S_OK = 0
,出现同样的错误。我可以写
S_OK, ...
,出现同样的错误。
小贴士:
我构建了一个 dll,它实现了 Windows API 到我的 CANoe 环境的一些功能。当然有 S_OK 的 typedef,但我无权访问任何其他 typedef 或全局变量,因为 CAPL dll 非常严格。这就是为什么我想实现这个简单的枚举。
谁能解释一下为什么编译器不想正确编译它?我不知道,这个错误对我来说太奇怪了(定义中的类型不兼容 ¯\_(ʘ ͟ʖʘ)_/¯
)。
问题是func1()
return是一个long
,但是S_OK
是一个枚举常量。因此出现错误“操作数类型不兼容”。以下是修复错误的两个选项:
- 将
S_OK
转换为long
:
long func1() {
return (long)S_OK;
}
- (首选)将 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
....
}