Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 30 Jan 2024 20:03:17 -0800
From:      Mark Millard <marklmi@yahoo.com>
To:        lexi@le-fay.org, freebsd-arch <freebsd-arch@freebsd.org>
Subject:   RE: improving C++ libc headers 
Message-ID:  <BB5833B0-7D6B-4982-A0FB-F07027135F17@yahoo.com>
References:  <BB5833B0-7D6B-4982-A0FB-F07027135F17.ref@yahoo.com>

next in thread | previous in thread | raw e-mail | index | archive | help
Lexi Winter <lexi_at_le-fay.org> wrote on
Date: Tue, 30 Jan 2024 13:30:54 UTC :

> i am considering working up a patch to improve C++ libc headers in =
FreeBSD.
>=20
> the problem with the current headers (which come from clang/libc++) is
> that this code compiles:
>=20
> ------
> #include <cstdlib>
> auto main() -> int {
> exit(0);
> }
> ------
>=20
> this should be a compile-time error, because <cstdio> does not declare
> ::exit[0]. however, it works because <cstdlib> is implemented like
> this:

While I like the removal of header pollution, various
C++ standard vintages have explicit wording that it is
not an error for "C++ headers for C library facilities"
(the for-C ones that are <c...> named) to be this way:

QUOTE of an example:
It is unspecified whether these names (. . .) are first
declared in the global namespace scope and are then
injected into namespace std by explicit using-declarations.
END QUOTE

> ------
> #include <stdlib.h> // exposes ::exit()
>=20
> namespace std {
> using ::exit;
> // ...
> }
> ------
>=20
> i would like to replace this with an implementation that does this
> instead:
>=20
> ------
> namespace std {
> extern "C" void exit(int);
> // ...
> }
> ------
>=20
> i have done a very quick proof of concept for this and it does work;
> there are some more complicated edge cases, but nothing that can't be
> dealt with from what i can see.
>=20
> but before i put any amount of significant effort into this, i'd like =
to
> check if this is something that is likely to be merged.
>=20
> to address some potential objections:
>=20
> - i don't believe this can be handled upstream in libc++, because some
> of these headers require knowledge of the implementation - <cstdio>
> needs to know about 'struct __sFILE', for example.
>=20
> - "import std" should solve this properly, but there are a lot of
> implementation issues with this and it's not clear if/when it will
> ever be supported; in the mean time, the existing standard headers
> should behave correctly.
>=20
> [0] https://www.eel.is/c++draft/cstdlib.syn#header:%3Ccstdlib%3E
> [1] =
https://cgit.freebsd.org/src/tree/contrib/llvm-project/libcxx/include/cstd=
lib


=3D=3D=3D
Mark Millard
marklmi at yahoo.com




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?BB5833B0-7D6B-4982-A0FB-F07027135F17>