aboutsummaryrefslogtreecommitdiffstats
path: root/man/man3/_Generic.3
diff options
context:
space:
mode:
authorAlejandro Colomar <alx@kernel.org>2024-04-26 15:06:49 +0200
committerAlejandro Colomar <alx@kernel.org>2024-05-02 01:24:19 +0200
commitdcde2f70372b49ec43efc5db864c9ff585d0a2dd (patch)
tree78b9b7425130e4a5858e4c01a524d802423879ed /man/man3/_Generic.3
parent12aca537ce78a41bbcdaf485209691e10f8002d7 (diff)
downloadman-pages-dcde2f70372b49ec43efc5db864c9ff585d0a2dd.tar.gz
man/, share/mk/: Move man*/ to man/
This is a scripted change: $ mkdir man/; $ mv man* man/; $ ln -st . man/man*; $ find share/mk/ -type f \ | xargs grep -l '^MANDIR *:=' \ | xargs sed -i '/^MANDIR *:=/s,$,/man,'; $ find share/mk/dist/ -type f \ | xargs grep -l man \ | xargs sed -i 's,man%,man/%,g'; Link: <https://lore.kernel.org/linux-man/YxcV4h+Xn7cd6+q2@pevik/T/> Cc: Petr Vorel <pvorel@suse.cz> Cc: Jakub Wilk <jwilk@jwilk.net> Cc: Stefan Puiu <stefan.puiu@gmail.com> Signed-off-by: Alejandro Colomar <alx@kernel.org>
Diffstat (limited to 'man/man3/_Generic.3')
-rw-r--r--man/man3/_Generic.364
1 files changed, 64 insertions, 0 deletions
diff --git a/man/man3/_Generic.3 b/man/man3/_Generic.3
new file mode 100644
index 0000000000..788a117ddf
--- /dev/null
+++ b/man/man3/_Generic.3
@@ -0,0 +1,64 @@
+.\" Copyright (C) 2022 Alejandro Colomar <alx@kernel.org>
+.\"
+.\" SPDX-License-Identifier: Linux-man-pages-copyleft
+.\"
+.TH _Generic 3 (date) "Linux man-pages (unreleased)"
+.SH NAME
+_Generic \- type-generic selection
+.SH SYNOPSIS
+.nf
+.BR _Generic( \fIexpression\fP ", type1: " e1 ", " "... /*" \
+", default: " "e */" );
+.fi
+.SH DESCRIPTION
+.BR _Generic ()
+evaluates the path of code under the type selector
+that is compatible with the type of the controlling
+.IR expression ,
+or
+.B default:
+if no type is compatible.
+.P
+.I expression
+is not evaluated.
+.P
+This is especially useful for writing type-generic macros,
+that will behave differently depending on the type of the argument.
+.SH STANDARDS
+C11.
+.SH HISTORY
+C11.
+.SH EXAMPLES
+The following program demonstrates how to write
+a replacement for the standard
+.BR imaxabs (3)
+function, which being a function can't really provide what it promises:
+seamlessly upgrading to the widest available type.
+.IP
+.\" SRC BEGIN (_Generic.c)
+.EX
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+\&
+#define my_imaxabs _Generic(INTMAX_C(0), \e
+ long: labs, \e
+ long long: llabs \e
+/* long long long: lllabs */ \e
+)
+\&
+int
+main(void)
+{
+ off_t a;
+\&
+ a = \-42;
+ printf("imaxabs(%jd) == %jd\en", (intmax_t) a, my_imaxabs(a));
+ printf("&imaxabs == %p\en", &my_imaxabs);
+ printf("&labs == %p\en", &labs);
+ printf("&llabs == %p\en", &llabs);
+\&
+ exit(EXIT_SUCCESS);
+}
+.EE
+.\" SRC END