mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-12-25 06:56:14 +01:00
Add and use G_SIZEOF_MEMBER() macro
A convenient macro present in the Linux kernel, named FIELD_SIZE() there. Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
This commit is contained in:
parent
fda1c651d5
commit
fd61a21ecd
@ -424,6 +424,7 @@ CLAMP
|
|||||||
G_APPROX_VALUE
|
G_APPROX_VALUE
|
||||||
|
|
||||||
<SUBSECTION>
|
<SUBSECTION>
|
||||||
|
G_SIZEOF_MEMBER
|
||||||
G_STRUCT_MEMBER
|
G_STRUCT_MEMBER
|
||||||
G_STRUCT_MEMBER_P
|
G_STRUCT_MEMBER_P
|
||||||
G_STRUCT_OFFSET
|
G_STRUCT_OFFSET
|
||||||
|
@ -224,9 +224,9 @@ g_local_file_output_stream_write (GOutputStream *stream,
|
|||||||
#ifdef G_OS_UNIX
|
#ifdef G_OS_UNIX
|
||||||
/* Macro to check if struct iovec and GOutputVector have the same ABI */
|
/* Macro to check if struct iovec and GOutputVector have the same ABI */
|
||||||
#define G_OUTPUT_VECTOR_IS_IOVEC (sizeof (struct iovec) == sizeof (GOutputVector) && \
|
#define G_OUTPUT_VECTOR_IS_IOVEC (sizeof (struct iovec) == sizeof (GOutputVector) && \
|
||||||
sizeof ((struct iovec *) 0)->iov_base == sizeof ((GOutputVector *) 0)->buffer && \
|
G_SIZEOF_MEMBER (struct iovec, iov_base) == G_SIZEOF_MEMBER (GOutputVector, buffer) && \
|
||||||
G_STRUCT_OFFSET (struct iovec, iov_base) == G_STRUCT_OFFSET (GOutputVector, buffer) && \
|
G_STRUCT_OFFSET (struct iovec, iov_base) == G_STRUCT_OFFSET (GOutputVector, buffer) && \
|
||||||
sizeof ((struct iovec *) 0)->iov_len == sizeof((GOutputVector *) 0)->size && \
|
G_SIZEOF_MEMBER (struct iovec, iov_len) == G_SIZEOF_MEMBER (GOutputVector, size) && \
|
||||||
G_STRUCT_OFFSET (struct iovec, iov_len) == G_STRUCT_OFFSET (GOutputVector, size))
|
G_STRUCT_OFFSET (struct iovec, iov_len) == G_STRUCT_OFFSET (GOutputVector, size))
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
@ -403,9 +403,9 @@ g_unix_output_stream_write (GOutputStream *stream,
|
|||||||
|
|
||||||
/* Macro to check if struct iovec and GOutputVector have the same ABI */
|
/* Macro to check if struct iovec and GOutputVector have the same ABI */
|
||||||
#define G_OUTPUT_VECTOR_IS_IOVEC (sizeof (struct iovec) == sizeof (GOutputVector) && \
|
#define G_OUTPUT_VECTOR_IS_IOVEC (sizeof (struct iovec) == sizeof (GOutputVector) && \
|
||||||
sizeof ((struct iovec *) 0)->iov_base == sizeof ((GOutputVector *) 0)->buffer && \
|
G_SIZEOF_MEMBER (struct iovec, iov_base) == G_SIZEOF_MEMBER (GOutputVector, buffer) && \
|
||||||
G_STRUCT_OFFSET (struct iovec, iov_base) == G_STRUCT_OFFSET (GOutputVector, buffer) && \
|
G_STRUCT_OFFSET (struct iovec, iov_base) == G_STRUCT_OFFSET (GOutputVector, buffer) && \
|
||||||
sizeof ((struct iovec *) 0)->iov_len == sizeof((GOutputVector *) 0)->size && \
|
G_SIZEOF_MEMBER (struct iovec, iov_len) == G_SIZEOF_MEMBER (GOutputVector, size) && \
|
||||||
G_STRUCT_OFFSET (struct iovec, iov_len) == G_STRUCT_OFFSET (GOutputVector, size))
|
G_STRUCT_OFFSET (struct iovec, iov_len) == G_STRUCT_OFFSET (GOutputVector, size))
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
@ -67,7 +67,7 @@ enum
|
|||||||
};
|
};
|
||||||
|
|
||||||
#ifndef UNIX_PATH_MAX
|
#ifndef UNIX_PATH_MAX
|
||||||
#define UNIX_PATH_MAX sizeof (((struct sockaddr_un *) 0)->sun_path)
|
#define UNIX_PATH_MAX G_SIZEOF_MEMBER (struct sockaddr_un, sun_path)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct _GUnixSocketAddressPrivate
|
struct _GUnixSocketAddressPrivate
|
||||||
|
@ -1096,4 +1096,18 @@
|
|||||||
|
|
||||||
#endif /* __GI_SCANNER__ */
|
#endif /* __GI_SCANNER__ */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* G_SIZEOF_MEMBER:
|
||||||
|
* @struct_type: a structure type, e.g. #GOutputVector
|
||||||
|
* @member: a field in the structure, e.g. `size`
|
||||||
|
*
|
||||||
|
* Returns: the size of @member in the struct definition without having a
|
||||||
|
* declared instance of @struct_type.
|
||||||
|
*
|
||||||
|
* Since: 2.64
|
||||||
|
*/
|
||||||
|
#define G_SIZEOF_MEMBER(struct_type, member) \
|
||||||
|
GLIB_AVAILABLE_MACRO_IN_2_64 \
|
||||||
|
sizeof (((struct_type *) 0)->member)
|
||||||
|
|
||||||
#endif /* __G_MACROS_H__ */
|
#endif /* __G_MACROS_H__ */
|
||||||
|
@ -50,6 +50,13 @@ test_alignof_fallback (void)
|
|||||||
check_alignof (struct { char a; int b; });
|
check_alignof (struct { char a; int b; });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
test_struct_sizeof_member (void)
|
||||||
|
{
|
||||||
|
G_STATIC_ASSERT (G_SIZEOF_MEMBER (struct { char a; int b; }, a) == sizeof (char));
|
||||||
|
g_assert_cmpint (G_SIZEOF_MEMBER (struct { char a; int b; }, b), ==, sizeof (int));
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
main (int argc,
|
main (int argc,
|
||||||
char *argv[])
|
char *argv[])
|
||||||
@ -58,6 +65,7 @@ main (int argc,
|
|||||||
|
|
||||||
g_test_add_func ("/alignof/fallback", test_alignof_fallback);
|
g_test_add_func ("/alignof/fallback", test_alignof_fallback);
|
||||||
g_test_add_func ("/assert/static", test_assert_static);
|
g_test_add_func ("/assert/static", test_assert_static);
|
||||||
|
g_test_add_func ("/struct/sizeof_member", test_struct_sizeof_member);
|
||||||
|
|
||||||
return g_test_run ();
|
return g_test_run ();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user