Liste des Groupes | Revenir à cl c |
David Brown <david.brown@hesbynett.no> writes:I meant either "static_assert" or "_Static_assert", rather than a mixture of the two! (I consider "static_assert" part of C11 even though it needs a header.)On 23/05/2024 18:40, Keith Thompson wrote:You mean _Static_assert.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 reasonIn pre-C23, _Static_assert and _Thread_local are keywords, and
8) bad. Breaks existing code for weak reason
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.
Yes. But including <assert.h> is optional.While using #define for a C keyword is undefined behaviour, in"static_assert" is already a macro defined in <assert.h> starting 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".)
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 byThe actual code I use had a number of conditional checks for different C standards and C++, so that it does not define a static_assert macro for C++ (my C++ usage for the code was always at least C++11), and for C11 onwards it was defined to _Static_assert. (I specifically did not want to include <assert.h>.)
adding "#undef static_assert" or by picking a different name, or by
making your macro definition conditional on __STDC_VERSION__ >= 202311L.
Les messages affichés proviennent d'usenet.