From 2eff71d28946896d085fbd0836ed1394bb55d352 Mon Sep 17 00:00:00 2001 From: Florian Weimer Date: Tue, 11 Nov 2025 18:20:10 +0100 Subject: [PATCH] stdlib: Do not define once_flag, ONCE_FLAG_INIT for C++ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The definition of once_flag conflicts with std::once_flag in if “using namespace std;” is active. Updates commit a7ddbf456d97ac8d1aa7afd735e196a1488bd874 ("Add once_flag, ONCE_FLAG_INIT and call_once to stdlib.h for C23"). Suggested-by: Jonathan Wakely Reviewed-by: Collin Funk --- manual/threads.texi | 17 +++++++++++++++-- stdlib/stdlib.h | 4 +++- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/manual/threads.texi b/manual/threads.texi index 1e9be32d66..b9d12479ca 100644 --- a/manual/threads.texi +++ b/manual/threads.texi @@ -23,8 +23,15 @@ POSIX threads. This section describes the @glibcadj{} ISO C threads implementation. To have a deeper understanding of this API, it is strongly recommended to read ISO/IEC 9899:2011, section 7.26, in which ISO C threads were -originally specified. All types and function prototypes are declared -in the header file @file{threads.h}. +originally specified. + +All types and function prototypes are declared in the header file +@file{threads.h}. When compiling for C, some functionality is also +available in @file{stdlib.h}. + +It is recommended that GNU systems use the functionality in +@file{pthread.h} instead of @file{thread.h}, as they are more portable +between C and C++. @menu * ISO C Threads Return Values:: Symbolic constants that represent a @@ -203,11 +210,17 @@ called once in the presence of multiple, potentially calling threads. @deftp {Data Type} once_flag @standards{C11, threads.h} A complete object type capable of holding a flag used by @code{call_once}. + +As of C23, @code{once_flag} is also defined in @file{stdlib.h}, +but only for C, not for C++. @end deftp @defvr Macro ONCE_FLAG_INIT @standards{C11, threads.h} This value is used to initialize an object of type @code{once_flag}. + +As of C23, @code{ONCE_FLAG_INIT} is also defined in @file{stdlib.h}, +but only for C, not for C++. @end defvr @deftypefun void call_once (once_flag *@var{flag}, void (*@var{func}) (void)) diff --git a/stdlib/stdlib.h b/stdlib/stdlib.h index 8d4d194a46..8416bd4446 100644 --- a/stdlib/stdlib.h +++ b/stdlib/stdlib.h @@ -1159,11 +1159,13 @@ extern int ttyslot (void) __THROW; #endif #if __GLIBC_USE (ISOC23) -# include +# ifndef __cplusplus +# include /* Call function __FUNC exactly once, even if invoked from several threads. All calls must be made with the same __FLAGS object. */ extern void call_once (once_flag *__flag, void (*__func)(void)); +# endif /* !__cplusplus */ /* Return the alignment of P. */ extern size_t memalignment (const void *__p);