我認為在 C 中為列舉變數賦值和 int 值是無效的,并且已經存在驗證這一點的問題,例如無法使用型別為 'int' 的右值初始化型別為 'designFlags' 的變數。
但是我只看到以下代碼不會導致編譯錯誤:
// https://github.com/opencv/opencv/blob/4.x/modules/core/include/opencv2/core/mat.hpp#L158-L265
class CV_EXPORTS _InputArray
{
public:
enum KindFlag { //!! KindFlag is an enum type
KIND_SHIFT = 16,
FIXED_TYPE = 0x8000 << KIND_SHIFT,
FIXED_SIZE = 0x4000 << KIND_SHIFT,
KIND_MASK = 31 << KIND_SHIFT,
...
}
...
};
// https://github.com/opencv/opencv/blob/4.x/modules/core/src/matrix_wrap.cpp#L370-L378
_InputArray::KindFlag _InputArray::kind() const
{
KindFlag k = flags & KIND_MASK; //!! this line, I think it is assign enum type var `k` with int value `flag & KIND_MASK`, but it it not cause compile error
#if CV_VERSION_MAJOR < 5
CV_DbgAssert(k != EXPR);
CV_DbgAssert(k != STD_ARRAY);
#endif
return k;
}
我嘗試InputArray_使用以下內容實作一個最小的類,這將導致編譯錯誤,具有與上述相同的受讓人,這讓我感到困惑:
// what.cpp
class InputArray_
{
public:
enum KindFlag {
KIND_SHIFT = 16,
KIND_MASK = 31 << KIND_SHIFT,
NONE = 0 << KIND_SHIFT,
MAT = 1 << KIND_SHIFT
};
bool empty() const;
InputArray_::KindFlag kind() const;
public:
InputArray_();
protected:
int flags;
void* obj;
};
InputArray_::KindFlag InputArray_::kind() const
{
KindFlag k = flags & KIND_MASK; //!! now this cause compile error
return k;
}
int main()
{
}
編譯器是 AppleClang 13.0.0,完整的錯誤資訊是:
what.cpp:26:14: error: cannot initialize a variable of type 'InputArray_::KindFlag' with an rvalue of type 'int'
KindFlag k = flags & KIND_MASK;
^ ~~~~~~~~~~~~~~~~~
1 error generated.
有誰知道為什么 OpenCV 不會導致編譯錯誤?
uj5u.com熱心網友回復:
opencv 定義運算子&本身,因此它不再導致int
您可以在鏈接的部分下方看到它
__CV_ENUM_FLAGS_BITWISE_AND(_InputArray::KindFlag, int, _InputArray::KindFlag)
關聯
宏的實作
#define __CV_ENUM_FLAGS_BITWISE_AND(EnumType, Arg1Type, Arg2Type) \
static inline EnumType operator&(const Arg1Type& a, const Arg2Type& b) \
{ \
typedef std::underlying_type<EnumType>::type UnderlyingType; \
return static_cast<EnumType>(static_cast<UnderlyingType>(a) & static_cast<UnderlyingType>(b)); \
}
關聯
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/382333.html
上一篇:Opencv,無法讓destroyAllWindows作業
下一篇:如何解決“cv2.error:OpenCV(4.5.4):-1:error:(-5:Badargument)infunction'imshow'”
