Deutsch English Français Italiano |
<87fru72elx.fsf@nosuchdomain.example.com> View for Bookmarking (what is this?) Look up another Usenet article |
Path: ...!weretis.net!feeder9.news.weretis.net!feeder8.news.weretis.net!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: Keith Thompson <Keith.S.Thompson+u@gmail.com> 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: <v2l828$18v7f$1@dont-email.me> <20240523150226.00007e7d@yahoo.com> <87a5kg5voc.fsf@nosuchdomain.example.com> <v2qal7$2c8rq$3@dont-email.me> 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= Bytes: 3505 David Brown <david.brown@hesbynett.no> writes: > On 23/05/2024 18:40, Keith Thompson wrote: >> Michael S <already5chosen@yahoo.com> writes: >> [...] >>> Removed >> [...] >>> 7) static_assert is not provided as a macro defined in <assert.h> >>> (becomes a keyword) >>> 8) thread_local is not provided as a macro defined in <threads.h> >>> (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 <assert.h> starting in C11. The above code is valid in pre-C23, but will break in C11 and C17 if it includes <assert.h> 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 */