From 5cb85d44934c92e5fc0b928f3627bed6f285793d Mon Sep 17 00:00:00 2001 From: Alejandro Colomar Date: Sun, 12 Feb 2023 20:32:41 +0100 Subject: _Generic.3: Remove example code Casting sockaddr structures is just a symptom that these APIs were seriously misdesigned. In GNU C, there's already a better way to handle this (see [[gnu::transparent_union]]). ISO C should be fixed. Let's not promote this kind of code. Signed-off-by: Alejandro Colomar --- man3/_Generic.3 | 89 --------------------------------------------------------- 1 file changed, 89 deletions(-) diff --git a/man3/_Generic.3 b/man3/_Generic.3 index 6ff5e24ea..db1620f5f 100644 --- a/man3/_Generic.3 +++ b/man3/_Generic.3 @@ -27,95 +27,6 @@ that will behave differently depending on the type of the argument. .SH STANDARDS C11 and later. .SH EXAMPLES -The following code demonstrates how to write -a macro similar to C++'s -.BR \%static_cast (), -which will allow casting safely between a limited set of types. -It is useful for example when calling -system calls or library functions that use compatible structures, -like for example -.BR bind (2) -with -.BR \%sockaddr (3type). -.IP -.EX -/* This code is in the public domain. */ - -#include -#include -#include - -#define sockaddr_cast(t, p) \e - _Generic(&*(p), \e - struct sockaddr *: \e - _Generic((typeof_unqual(t)) NULL, \e - struct sockaddr_in *: (t) (p), \e - struct sockaddr_in6 *: (t) (p), \e - struct sockaddr_un *: (t) (p), \e - default: (p)), \e - struct sockaddr **: \e - _Generic((typeof_unqual(t)) NULL, \e - struct sockaddr_in **: (t) (p), \e - struct sockaddr_in6 **: (t) (p), \e - struct sockaddr_un **: (t) (p), \e - default: (p)), \e - const struct sockaddr *: \e - _Generic((t) NULL, \e - const struct sockaddr_in *: (t) (p), \e - const struct sockaddr_in6 *: (t) (p), \e - const struct sockaddr_un *: (t) (p), \e - default: (p)), \e - \e - struct sockaddr_in *: \e - _Generic((typeof_unqual(t)) NULL, \e - struct sockaddr *: (t) (p), \e - default: (p)), \e - struct sockaddr_in **: \e - _Generic((typeof_unqual(t)) NULL, \e - struct sockaddr **: (t) (p), \e - default: (p)), \e - const struct sockaddr_in *: \e - _Generic((t) NULL, \e - const struct sockaddr *: (t) (p), \e - default: (p)), \e - \e - struct sockaddr_in6 *: \e - _Generic((typeof_unqual(t)) NULL, \e - struct sockaddr *: (t) (p), \e - default: (p)), \e - struct sockaddr_in6 **: \e - _Generic((typeof_unqual(t)) NULL, \e - struct sockaddr **: (t) (p), \e - default: (p)), \e - const struct sockaddr_in6 *: \e - _Generic((t) NULL, \e - const struct sockaddr *: (t) (p), \e - default: (p)), \e - \e - struct sockaddr_un *: \e - _Generic((typeof_unqual(t)) NULL, \e - struct sockaddr *: (t) (p), \e - default: (p)), \e - struct sockaddr_un **: \e - _Generic((typeof_unqual(t)) NULL, \e - struct sockaddr **: (t) (p), \e - default: (p)), \e - const struct sockaddr_un *: \e - _Generic((t) NULL, \e - const struct sockaddr *: (t) (p), \e - default: (p)), \e - \e - default: \e - (p) \e - ) - -socklen_t slen; -struct sockaddr_un sun; - -slen = sizeof(ss); -getsockname(sfd, sockaddr_cast(struct sockaddr *, &sun), &slen); -.EE -.PP The following program demonstrates how to write a replacement for the standard .BR imaxabs (3) -- cgit v1.2.3