Date: Thu, 4 Apr 2024 09:15:32 -0400
C23 adds a macro named `unreachable` to <stddef.h>. C++23 adds a
function named `std::unreachable` to <utility>. What should the
behavior of this code be when compiled in C++23?
#include <stddef.h>
#ifndef unreachable
#error "oh no, my macro!"
#endif
[support.c.headers.general]p1
(https://eel.is/c++draft/support.c.headers#general-1) says:
For compatibility with the C standard library, the C++ standard
library provides the C headers shown in Table 40. The intended use of
these headers is for interoperability only. It is possible that C++
source files need to include one of these headers in order to be valid
ISO C. Source files that are not intended to also be valid ISO C
should not use any of the C headers.
I read this as saying that including a C header in a C++
implementation should provide all the interfaces from the C header
unless the C++ standard says something else. Since C++23 isn't based
on top of C23 and thus says nothing about the `unreachable` macro in
stddef.h, I think this implies that the code should compile.
(Similarly, including stdbit.h should be fine if the header exists, or
including string.h and using strdup or memccpy should work, and so on
for all the newly introduced C23 library functionality.) I think this
matches user expectations and the intent of the standard, but the
situation with unreachable is a bit odd and the question came up
during a code review for Clang which removes the macro from stddef.h
in C++ mode because of the potential for conflict with the function
declared in <utility>.
I have two concrete questions:
1) Before WG21 has rebased on top of the latest C, are C++
implementations expected to strip out all interfaces from C standard
library headers that are not in the version of C which C++ has based
the library on?
2) If the answer to #1 is "no, C++ implementations are expected to
provide the C interfaces present unless otherwise stated", is
unreachable likely to be special when C++ rebases on top of C23?
Thanks!
~Aaron
function named `std::unreachable` to <utility>. What should the
behavior of this code be when compiled in C++23?
#include <stddef.h>
#ifndef unreachable
#error "oh no, my macro!"
#endif
[support.c.headers.general]p1
(https://eel.is/c++draft/support.c.headers#general-1) says:
For compatibility with the C standard library, the C++ standard
library provides the C headers shown in Table 40. The intended use of
these headers is for interoperability only. It is possible that C++
source files need to include one of these headers in order to be valid
ISO C. Source files that are not intended to also be valid ISO C
should not use any of the C headers.
I read this as saying that including a C header in a C++
implementation should provide all the interfaces from the C header
unless the C++ standard says something else. Since C++23 isn't based
on top of C23 and thus says nothing about the `unreachable` macro in
stddef.h, I think this implies that the code should compile.
(Similarly, including stdbit.h should be fine if the header exists, or
including string.h and using strdup or memccpy should work, and so on
for all the newly introduced C23 library functionality.) I think this
matches user expectations and the intent of the standard, but the
situation with unreachable is a bit odd and the question came up
during a code review for Clang which removes the macro from stddef.h
in C++ mode because of the potential for conflict with the function
declared in <utility>.
I have two concrete questions:
1) Before WG21 has rebased on top of the latest C, are C++
implementations expected to strip out all interfaces from C standard
library headers that are not in the version of C which C++ has based
the library on?
2) If the answer to #1 is "no, C++ implementations are expected to
provide the C interfaces present unless otherwise stated", is
unreachable likely to be special when C++ rebases on top of C23?
Thanks!
~Aaron
Received on 2024-04-04 13:15:48