mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager
synced 2024-10-07 00:31:11 +00:00
shared: move definition of "bool" to nm-macros-internal.h
"nm-default.h" should only include all the relevant header files based on NETWORKMANAGER_COMPILATION. It should not contain definitions on it's own. Move the definition of "bool" to "nm-macros-internal.h".
This commit is contained in:
parent
b8c677a0eb
commit
6dc431b0c9
|
@ -74,51 +74,4 @@
|
|||
|
||||
/*****************************************************************************/
|
||||
|
||||
/**
|
||||
* The boolean type _Bool is C99 while we mostly stick to C89. However, _Bool is too
|
||||
* convinient to miss and is effectively available in gcc and clang. So, just use it.
|
||||
*
|
||||
* Usually, one would include "stdbool.h" to get the "bool" define which aliases
|
||||
* _Bool. We provide this define here, because we want to make use of it anywhere.
|
||||
* (also, stdbool.h is again C99).
|
||||
*
|
||||
* Using _Bool has advantages over gboolean:
|
||||
*
|
||||
* - commonly _Bool is one byte large, instead of gboolean's 4 bytes (because gboolean
|
||||
* is a typedef for gint). Especially when having boolean fields in a struct, we can
|
||||
* thereby easily save some space.
|
||||
*
|
||||
* - _Bool type guarantees that two "true" expressions compare equal. E.g. the follwing
|
||||
* will not work:
|
||||
* gboolean v1 = 1;
|
||||
* gboolean v2 = 2;
|
||||
* g_assert_cmpint (v1, ==, v2); // will fail
|
||||
* For that, we often to use !! to coerce gboolean values to 0 or 1:
|
||||
* g_assert_cmpint (!!v2, ==, TRUE);
|
||||
* With _Bool type, this will be handled properly by the compiler.
|
||||
*
|
||||
* - For structs, we might want to safe even more space and use bitfields:
|
||||
* struct s1 {
|
||||
* gboolean v1:1;
|
||||
* };
|
||||
* But the problem here is that gboolean is signed, so that
|
||||
* v1 will be either 0 or -1 (not 1, TRUE). Thus, the following
|
||||
* fails:
|
||||
* struct s1 s = { .v1 = TRUE, };
|
||||
* g_assert_cmpint (s1.v1, ==, TRUE);
|
||||
* It will however work just fine with bool/_Bool while retaining the
|
||||
* notion of having a boolean value.
|
||||
*
|
||||
* Also, add the defines for "true" and "false". Those are nicely highlighted by the editor
|
||||
* as special types, contrary to glib's "TRUE"/"FALSE".
|
||||
*/
|
||||
|
||||
#ifndef bool
|
||||
#define bool _Bool
|
||||
#define true 1
|
||||
#define false 0
|
||||
#endif
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
#endif /* __NM_DEFAULT_H__ */
|
||||
|
|
|
@ -446,4 +446,51 @@ nm_decode_version (guint version, guint *major, guint *minor, guint *micro) {
|
|||
|
||||
/*****************************************************************************/
|
||||
|
||||
/**
|
||||
* The boolean type _Bool is C99 while we mostly stick to C89. However, _Bool is too
|
||||
* convinient to miss and is effectively available in gcc and clang. So, just use it.
|
||||
*
|
||||
* Usually, one would include "stdbool.h" to get the "bool" define which aliases
|
||||
* _Bool. We provide this define here, because we want to make use of it anywhere.
|
||||
* (also, stdbool.h is again C99).
|
||||
*
|
||||
* Using _Bool has advantages over gboolean:
|
||||
*
|
||||
* - commonly _Bool is one byte large, instead of gboolean's 4 bytes (because gboolean
|
||||
* is a typedef for gint). Especially when having boolean fields in a struct, we can
|
||||
* thereby easily save some space.
|
||||
*
|
||||
* - _Bool type guarantees that two "true" expressions compare equal. E.g. the follwing
|
||||
* will not work:
|
||||
* gboolean v1 = 1;
|
||||
* gboolean v2 = 2;
|
||||
* g_assert_cmpint (v1, ==, v2); // will fail
|
||||
* For that, we often to use !! to coerce gboolean values to 0 or 1:
|
||||
* g_assert_cmpint (!!v2, ==, TRUE);
|
||||
* With _Bool type, this will be handled properly by the compiler.
|
||||
*
|
||||
* - For structs, we might want to safe even more space and use bitfields:
|
||||
* struct s1 {
|
||||
* gboolean v1:1;
|
||||
* };
|
||||
* But the problem here is that gboolean is signed, so that
|
||||
* v1 will be either 0 or -1 (not 1, TRUE). Thus, the following
|
||||
* fails:
|
||||
* struct s1 s = { .v1 = TRUE, };
|
||||
* g_assert_cmpint (s1.v1, ==, TRUE);
|
||||
* It will however work just fine with bool/_Bool while retaining the
|
||||
* notion of having a boolean value.
|
||||
*
|
||||
* Also, add the defines for "true" and "false". Those are nicely highlighted by the editor
|
||||
* as special types, contrary to glib's "TRUE"/"FALSE".
|
||||
*/
|
||||
|
||||
#ifndef bool
|
||||
#define bool _Bool
|
||||
#define true 1
|
||||
#define false 0
|
||||
#endif
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
#endif /* __NM_MACROS_INTERNAL_H__ */
|
||||
|
|
Loading…
Reference in a new issue