Am 16.04.26 um 06:52 schrieb Kevin J. McCarthy:
So... I guess this is C23. Which I know almost nothing about :-D. In
any case, we're a long ways away from getting to that level of C
standard support in Mutt.
It's actually a C11 feature that is finally leveraged in the C23
stdlib.h, see https://en.cppreference.com/w/c/language/generic.html or
https://stackoverflow.com/questions/9804371/syntax-and-sample-usage-of-generic-in-c11
or
https://learn.microsoft.com/en-us/cpp/c-language/generic-selection?view=msvc-170
So the only other alternative might be something like the other
approach of a "const char *" function and a "char *" wrapper. I don't
insist on that though; it was just brainstorming.
There are two items everyone needs to know about C23 (a more complete
but still concise overview is in the Android sources
<https://android.googlesource.com/platform/bionic/+/HEAD/docs/c23.md>)
1. C23 CHANGES INCOMPATIBLY how a function _declaration_ without
arguments is interpreted.
As of C23, int func() means the same as int func(void), must/will not
take arguments, where C18 and before interpreted "has no prototype, any
number of arguments is fine", although that had been deprecated since
C99 or so.
2. GCC 15 (which is shipped by some mainline distributions) compiles C23
by default, unless you tell it otherwise with an -std= option.
The practical impact is,
* it can break in code if there is very old code around that was not
fully converted to provide prototypes everywhere,
* IT CHANGES THE RESULT of autoconf tests as a consequence,
It seems mutt's configure.ac is unaffected, but rest assured lots of
AC_RUN_IFELSE (with AC_LINK_IFELSE, AC_COMPILE_IFELSE) and the preceding
AC_TRY_LINK, AC_TRY_RUN and AC_TRY_COMPILE in lots of autotools projects
with a long history are affected and then often mistakenly assess that
some function or construct were unavailable.
* it can accept your code that is fine for a C23 or C++ compiler that
will cause compiler diagnostics on C99, C11, C17/C18 compilers (example
below).
For extensive distraction, there are two practical experiences from
fetchmail that I fixed last year, for elucidation:
- Changing autoconf result between K&R/C89/C99/C11/C17 and C23 compilers:
AC_LANG_PROGRAM([[
/* ... */
#ifdef HAVE_RESOLV_H
#include <resolv.h>
#endif
extern int res_search();
/* ... */
]], [[res_search(0, 0, 0, 0, 0); dn_skipname(0,0);]])
The program would break in C23 because either the res_search()
redeclaration was incompatible with the one in <resolv.h>, or the header
was missing and HAVE_RESOLV_H undefined, and res_search() (being
interpreted as res_search(void) in C23). It was used in AC_LINK_IFELSE
and with C23 would believe res_search to be missing on the system.
- "compiler diagnostic on newly written code with older compilers" was
here where I wrote a C23/C++ prototype (*) to a new clear_vis_buf()
function that I needed to change to be valid C17/C11/C99, too:
gitlab.com/fetchmail/fetchmail/-/commit/77fbbc8f5ef3fc6240de72c6e265036c7e3fb941
(*: I write quite a bit of C++ in my paying job where int func() has
meant the same as int func(void) aka "no arguments" for many years).