Aşağıdaki kodu:Bir işaretçiyi, yazılan/boyutlandırılmış enum ile bir işaretçiyi temeldeki türe dönüştürmek güvenli midir?
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
}
aşağıdaki hatayı üretir: Ben mutlaka o altta yatan türü ile temsil edilir anlamına geleceğini ENUM en tanımında : uint8_t
düşündüğü için bana şaşırtıcı
/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) { }
. Bence teminat sağlamıyor ben çok fazla sakıncası, ama bunu atlamak için bir hata olduğunu verilen yok
f((uint8_t*)&e);
, bu her zaman güvenlidir veya : uint8_t
: Ben kolayca alçıyla bu sorunun üstesinden gelebilirsiniz bu?
Bunun bir hata olmasını istersiniz. Söz konusu işlev, "enum" unızın dışındaki değerleri atarsa, bunun gerçekleşmesini ister misiniz? "İmzasız" beklediği bir işleve int * 'yi aktarmadan, yayınlamadan izin vermenin iyi bir fikir olduğunu söylemek gibi; elbette, genellikle aynı boydadırlar, ama o zaman bile, bir tanesinin yarısı diğeri için tamamen farklı bir anlama sahiptir. – ShadowRanger
Ve muhtemelen dökümünle katı takma kuralı kırıyorsunuz. – Jarod42
'e ', bellekte bir uint8_t olarak var, bu nedenle döküm güvenli olmalı. – Jacek