On Tue, Oct 25, 2022 at 2:13 PM Paul Eggert <egg...@cs.ucla.edu> wrote:
>
> On 2022-10-23 07:47, Bruno Haible wrote:
> >    #include <assert.h>
> >    #undef/**/assert
> > + /* Solaris 11.4 <assert.h> defines static_assert as a macro with 2 
> > arguments.
> > +    We need it also to be invocable with a single argument.  */
> > + #if defined __sun && (__STDC_VERSION__ - 0 >= 201112L) && !defined 
> > __cplusplus
> > +  #undef static_assert
> > +  #define static_assert _Static_assert
> > + #endif
> >   #endif])
>
> Will this approach work if code does something like the following? I
> worry that the later <assert.h> includes would collide with config.h's
> definition of static_assert.
>
>    #include <config.h>
>
>    #define NDEBUG 1
>    #include <assert.h>
>
>    #define NDEBUG 0
>    #include <assert.h>
>
>    static_assert (true);
>
> Come to think of it, the latest C23 draft is a little squirrelly here,
> as its section 7.2 says that <assert.h> defines a static_assert macro.
> This must be a typo because it never goes no to say anything about what
> the macro does, and static_assert is a keyword in C23.
>
> Also, while we're on the topic, why does the latest C23 draft require
> that when NDEBUG is defined, the assert macro is defined via "#define
> assert(...) ((void)0)" rather than as "#define assert(ignore)
> ((void)0)"? What's the point of requiring the ellipsis?

Re: the ellipses. From
https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2264r3.html,
Section 8:

    These changes are relative to N2573. If those changes are
    applied the minimal change for C++ standard proposed above
    could be used.

    In section 7.2 (Diagnostics <assert.h>) change the
    definition of the assert() macro to use elipsis instead of
    a single macro parameter:
    ...

Jeff

Reply via email to