On 10/07/2013 08:16 AM, Peter Krempa wrote:
>> + switch ((virDomainHostdevSubsysPciBackendType)
>> + dev->source.subsys.u.pci.backend) {
>
> I'm assuming you're doing the typecast so that you're forced to have a
> case for every enum value. Do we have an official policy on that? I see
> similar typecasts for switch statements in a few places, but I don't
> know that I'm so fond of it...
I started adding this on multiple places earlier. I don't know if
there's a official strategy, but I tend to prefer it as I was bitten a
few times by adding a new enum value and missed a few switches where I
actually should handle those. That's why I'm adding the typecasts where
possible.
I actually like it as well - any time you can make the compiler catch
your mistakes at compile time, rather than waiting until an obscure
error at runtime, is a win, even if the syntax is a bit awkward (casting
to force the correct type checking, and listing dead case labels to
appease the compiler).
>
> (Personally, I think if we're going to do enforce explicit listing of
> all cases in switch statements for an attribute that has an enum
> associated with it, it would be better to define the field with the
> actual enum type rather than int - these are internal data structures
> that are never passed from one machine to another, so it's not like
> there would ever be any compatibility problem.)
That would be a ideal global solution. Unfortunately as the
SOMETypeFromString macroed functions return -1 on failure almost all
variables holding the value got by this functions are declared as int
rather than the appropriate enum value. To avoid the need for a separate
intermediate variable we tend to declare the holding vars as int.
The cast inside the switch is a reasonable compromise, since it is often
easier to pass int around (and in public APIs, we _have_ to pass int
around - not all enums are private-use only).
>> + break;
>> +
>> + case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT:
>> + case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM:
>> + case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_TYPE_LAST:
>
> Again - I dislike having these sentinel values showing up in switch
> statements (searching the source I see it a lot), as it could lead
> someone to believe that those are actually valid values. I may be
> outvoted on this though :-)
I think that the benefits of the compiler warning in case you add a new
variable on places you might have forgotten outweigh a few occurences of
unused type in the code.
Agreed. Maybe we should patch HACKING to capture the outcome of this
discussion.
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library
http://libvirt.org