RE: improving C++ libc headers

Mark Millard <[email protected]>
Newsgroups gmane.os.freebsd.architechture
Message-ID <[email protected]>
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.
> 
> the problem with the current headers (which come from clang/libc++) is
> that this code compiles:
> 
> ------
> #include <cstdlib>
> auto main() -> int {
> exit(0);
> }
> ------
> 
> 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()
> 
> namespace std {
> using ::exit;
> // ...
> }
> ------
> 
> i would like to replace this with an implementation that does this
> instead:
> 
> ------
> namespace std {
> extern "C" void exit(int);
> // ...
> }
> ------
> 
> 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.
> 
> 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.
> 
> to address some potential objections:
> 
> - 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.
> 
> - "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.
> 
> [0] https://www.eel.is/c++draft/cstdlib.syn#header:%3Ccstdlib%3E
> [1] https://cgit.freebsd.org/src/tree/contrib/llvm-project/libcxx/include/cstdlib


===
Mark Millard
marklmi at yahoo.com
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.