X-Git-Url: https://git.distorted.org.uk/~mdw/mLib/blobdiff_plain/18c831dcd0ae4d660c70ccac69d27ed2a97851be..c418910f63a882d53d76f0711fa79eff7387d9e0:/utils/macros.3 diff --git a/utils/macros.3 b/utils/macros.3 index 962e81a..bd8cbb6 100644 --- a/utils/macros.3 +++ b/utils/macros.3 @@ -3,17 +3,171 @@ .SH NAME macros \- useful macros .\" @N +.\" @STR +.\" @GLUE +.\" @DISCARD +.\" @IGNORE +.\" @DEPRECATED +.\" @EXECL_LIKE +.\" @IGNORABLE +.\" @NORETURN +.\" @PRINTF_LIKE +.\" @SCANF_LIKE +.\" @MUFFLE_WARNINGS_DECL +.\" @MUFFLE_WARNINGS_EXPR +.\" @MUFFLE_WARNINGS_STMT +.\" @GCC_VERSION_P +.\" @GCC_WARNING .SH SYNOPSIS .nf .B "#include " .BI "size_t N(" array ");" +.BI "STR(" tokens\fR... ")" +.BI "GLUE(" tokens\fR... ", " tokens\fR... ")" + +.BI "void DISCARD(" scalar ");" +.BI "void IGNORE(" variable ");" + +.BI "DEPRECATED(" msg ")" +.BI "EXECL_LIKE(" ntrail ")" +.BI "IGNORABLE" +.BI "NORETURN" +.BI "PRINTF_LIKE(" fmt-index ", " arg-index ")" +.BI "SCANF_LIKE(" fmt-index ", " arg-index ")" + +.BI "MUFFLE_WARNINGS_DECL(" warns ", " decls ")" +.BI "MUFFLE_WARNINGS_EXPR(" warns ", " expr ")" +.BI "MUFFLE_WARNINGS_STMT(" warns ", " stmt ")" + +.BI "int GCC_VERSION_P(" maj ", " min ");" +.BI "GCC_WARNING(" option ")" +.BI "CLANG_WARNING(" option ")" .fi .SH DESCRIPTION +.SS Utilities The .B N macro returns the number of elements in the named .IR array . +.PP +The +.B STR +macro expands to a string literal containing the result of expanding its +argument +.IR tokens . +.PP +The +.B GLUE +macro expands to a single token, which is the result of gluing together +the tokens resulting from expanding its argument token lists. Each of +the argument token lists must expand to a single preprocessing token, +and the result of gluing these tokens together must be valid +preprocessing token. +.PP +The +.B DISCARD +macro discards its argument, which must be of some scalar type. This +can be useful in muffling warnings about ignoring return codes in cases +where you really don't care. +.PP +The +.B IGNORE +macro ignores its argument, which may be an expression of any type. +This can be useful in muffling warnings about unused variables. +.SS Annotations +The following annotations can be attached to function declarations and +definitions, as part of the declaration specifiers. (Other positions +may also work, depending on your compiler, but don't bet on it.) They +might not have any effect, depending on your specific compiler. +Currently only GCC is well supported, but exactly which features are +available depend on the compiler version. +.PP +Using a function or variable marked as +.B DEPRECATED +may provoke a compiler warning; this warning may (depending on your +compiler version) include the given +.IR msg . +.PP +A variadic function marked as +.B EXECL_LIKE +must be called with a null pointer (i.e., an integer constant +expression with value 0, cast to +.BR "void *") +in the variadic part of its argument list, followed by +.I ntrail +further arguments. Typically, +.I ntrail +is zero. Compilers may warn about misuse of such functions. +.PP +A function or variable marked as +.B IGNORABLE +need not be used. This may muffle warnings about leaving the marked +definition unused. +.PP +A function marked as +.B NORETURN +must not return. It must have return type +.BR void . +This may be useful in muffling warnings about uninitialized variables, +for example. +.PP +A variadic function marked as +.B PRINTF_LIKE +takes a +.BR printf (3)-style +format argument (in position +.IR fmt-index , +counting from 1) and a variable-length list of arguments to be formatted +(starting from position +.IR arg-index ). +Compilers may warn about misuse of such functions. +.PP +A variadic function marked as +.B SCANF_LIKE +takes a +.BR scanf (3)-style +format argument (in position +.IR fmt-index , +counting from 1) and a variable-length list of arguments to be formatted +(starting from position +.IR arg-index ). +Compilers may warn about misuse of such functions. +.SS Muffling warnings +Some compilers allow you to muffle warnings in particular pieces of +code. These macros provide a compiler-neutral interface to such +facilities. Each macro takes an argument +.IR warns , +which is a sequence of calls to +.IB compiler _WARNING +macros listing the warnings to be muffled. The list may contain +warnings for several different compilers. The other argument is a +.I body +consisting of declarations (in the case of +.BR MUFFLE_WARNINGS_DECL ), +an expression (for +.BR MUFFLE_WARNINGS_EXPR ), +or a statement (for +.BR MUFFLE_WARNINGS_STMT ). +.SS GCC-specific features +The +.B GCC_VERSION_P +macro returns a nonzero value if the compiler is at least version +.IB maj . min +of GCC, and zero otherwise. It's useful in preprocessor conditions. +.PP +The +.B GCC_WARNING +macro is intended to be used in +.I warns +lists (see above). It takes a string-literal argument +.I option +naming a GCC warning option, e.g., +.BR """\-Wdiv-by-zero""" . +.PP +The +.B CLANG_WARNING +is similar, except that it works with the Clang compiler. .SH "SEE ALSO" .BR mLib (3). .SH "AUTHOR"