mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-04-23 08:40:40 +02:00
all: add C99's "bool" define
https://mail.gnome.org/archives/networkmanager-list/2015-November/msg00036.html
This commit is contained in:
parent
0c65b28960
commit
37824def11
2 changed files with 55 additions and 0 deletions
|
|
@ -70,4 +70,51 @@
|
|||
|
||||
/*****************************************************************************/
|
||||
|
||||
/**
|
||||
* 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__ */
|
||||
|
|
|
|||
|
|
@ -65,6 +65,14 @@
|
|||
#include "nm-test-utils.h"
|
||||
#include "test-general-enums.h"
|
||||
|
||||
/* When passing a "bool" typed argument to a variadic function that
|
||||
* expects a gboolean, the compiler will promote the integer type
|
||||
* to have at least size (int). That way:
|
||||
* g_object_set (obj, PROP_BOOL, bool_val, NULL);
|
||||
* will just work correctly. */
|
||||
G_STATIC_ASSERT (sizeof (gboolean) == sizeof (int));
|
||||
G_STATIC_ASSERT (sizeof (bool) <= sizeof (int));
|
||||
|
||||
static void
|
||||
vpn_check_func (const char *key, const char *value, gpointer user_data)
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue