以下代码:
void f(const uint8_t* a) {} // <- this is an external library function
enum E : uint8_t { X, Y, Z };
int main(void) {
E e = X;
f(&e); // <- error here
}
会产生以下错误:
/tmp/c.cc:10:3: error: no matching function for call to 'f'
f(&e);
^
/tmp/c.cc:5:6: note: candidate function not viable: no known conversion from 'E *' to 'const uint8_t *' (aka 'const unsigned char *') for 1st argument
void f(const uint8_t* e) { }
这让我感到惊讶,因为我认为枚举定义中的 : uint8_t
意味着它们必须用该基础类型表示。但我可以通过转换轻松解决这个问题:
f((uint8_t*)&e);
我不太介意这点,但考虑到省略它是一个错误,这样做总是安全的吗?或者: uint8_t
并没有提供我认为它提供的保证?
e
作为 uint8_t 存在于内存中,所以强制转换应该是安全的。 - Jacek