On Fri, Dec 12, 2008 at 09:58:32AM +0100, Jim Meyering wrote:
Hello,
I don't want to make waves, but I do care about certain aspects of code quality, so...
I propose to allow (encourage, even) the use of the standard C99 type, bool, in libvirt, but not in public interfaces[1]. There are already uses in cgroup.c and xmlrpc.c, as well as those in the gnulib "c-ctype.h" header which is included from many of libvirt's .c files.
The motivation is to make the code as readable as possible. When you see the declaration of an "int" variable, member, or function, that type gives you no clue whether it is used as a boolean. If you see a few uses that treat it as boolean, that's still no guarantee, and it may be non-trivial to ensure that there isn't some non-boolean value with a special meaning.
However, if you see a "bool" variable, you do have that guarantee.
I don't particularly like the idea of using the bool type - No system header files use it - Library header files which use a boolean type have nearly all defined their own custom bool types, not using stdbool.h and there's no guarentee that stdbool's idea of 'true' matches the other apps' - We don't use it in the public API, or on the wire for the remote protocol, since it has undefined size. - The GNULIB bool emulation is unable to provide equivlance between C's idea of true (any non-zero value) and the defined 'true' constant (whose value is 1) - Bitfields are more size efficient than bools. In a language like python where there's a fundamental builtin type in the language for 'bool' this it makes sense. In the C world with many many[1] different definitions of bool, true and false it just feels like a world of hurt. The only thing you can ultimately rely on is that a true value is non-zero. Daniel [1] Picking a *tiny* selection of the bool's in my dev box headers /usr/include/xulrunner-sdk-1.9/stable/jritypes.h:typedef enum JRIBoolean { /usr/include/xulrunner-sdk-1.9/stable/nptypes.h: typedef int bool; /usr/include/xulrunner-sdk-1.9/stable/npapi.h:typedef unsigned char NPBool; /usr/include/xulrunner-sdk-1.9/stable/jri_md.h:typedef unsigned char jbool; /usr/include/wine/windows/wtypes.idl:typedef long BOOL; /usr/include/cups/raster.h:typedef enum cups_bool_e /**** Boolean type ****/ /usr/include/lcms.h:typedef int LCMSBOOL; /usr/include/mp4.h:typedef int bool; /usr/include/tss/tpm.h:typedef BYTE TPM_BOOL; /usr/include/tss/platform.h: typedef int8_t TSS_BOOL; /usr/include/tss/platform.h: typedef signed char TSS_BOOL; -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|