Path: csiph.com!news.swapon.de!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: Keith Thompson Newsgroups: comp.lang.c Subject: Re: C23 thoughts and opinions Date: Fri, 24 May 2024 12:29:14 -0700 Organization: None to speak of Lines: 59 Message-ID: <87fru72elx.fsf@nosuchdomain.example.com> References: <20240523150226.00007e7d@yahoo.com> <87a5kg5voc.fsf@nosuchdomain.example.com> MIME-Version: 1.0 Content-Type: text/plain Injection-Date: Fri, 24 May 2024 21:29:15 +0200 (CEST) Injection-Info: dont-email.me; posting-host="9bf1a2728fa7020763691602348055f5"; logging-data="2596634"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+HJKyZ2BPetA8eaRvizEy1" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.2 (gnu/linux) Cancel-Lock: sha1:UzlBBzlXK2kpLKzhnnfd4ZsKkLo= sha1:tIoh1cbZWFWmzzu9TE5XiONoDJI= Xref: csiph.com comp.lang.c:385018 David Brown writes: > On 23/05/2024 18:40, Keith Thompson wrote: >> Michael S writes: >> [...] >>> Removed >> [...] >>> 7) static_assert is not provided as a macro defined in >>> (becomes a keyword) >>> 8) thread_local is not provided as a macro defined in >>> (becomes a keyword) >>> >> [...] >>> 7) bad. Breaks existing code for weak reason >>> 8) bad. Breaks existing code for weak reason >> In pre-C23, _Static_assert and _Thread_local are keywords, and >> static_assert and thread_local are macros that expand to those keywords. >> In C23, _Static_assert, _Thread_local, static_assert, and >> thread_local >> are all keywords. Code that simply uses the old ugly keywords would not >> break. >> Code that does something like "#ifdef static_assert". I suppose the >> headers could have retained the old macro definitions. >> #define static_assert static_assert >> #define thread_local thread_local >> > > The sort of code that could theoretically break is when you have > definitions like this: > > #define STATIC_ASSERT_NAME_(line) STATIC_ASSERT_NAME2_(line) > #define STATIC_ASSERT_NAME2_(line) assertion_failed_at_line_##line > #define static_assert(claim, warning) \ > typedef struct { \ > char STATIC_ASSERT_NAME_(__COUNTER__) [(claim) ? 2 : -2]; \ > } STATIC_ASSERT_NAME_(__COUNTER__) > > That works in any C version, until C23, almost as well as > _static_assert. I used this when C11 support was rare in the tools I > used. You mean _Static_assert. > While using #define for a C keyword is undefined behaviour, in > practice I think you'd have a hard time finding code and a compiler > that used such a macro and which did not work just as well in C23 > mode. > > (I don't know if anyone is in the habit of declaring macros named > "thread_local".) "static_assert" is already a macro defined in starting in C11. The above code is valid in pre-C23, but will break in C11 and C17 if it includes directly or indirectly. You can fix it by adding "#undef static_assert" or by picking a different name, or by making your macro definition conditional on __STDC_VERSION__ >= 202311L. -- Keith Thompson (The_Other_Keith) Keith.S.Thompson+u@gmail.com void Void(void) { Void(); } /* The recursive call of the void */