[PATCH 5/5] include: Fix conflicting definitions of NULL, wchar_t, wint_t, wctype_t.

Jacek Caban jacek at codeweavers.com
Wed Jul 22 07:35:15 CDT 2020


Hi Kevin,

On 17.07.2020 03:12, Puetz Kevin A wrote:
> When <basetyps.h> defines wchar_t, it must obey -f(no-)short-wchar
> by referring to __WCHAR_TYPE__ which may not be `unsigned short`.
> Similarly, windef.h defining NULL may need to use GCC's __null.
> Otherwise one-definition-rule problems arise depending on whether
> wine or libc headers are included first.
>
> Implementing these by deferring to the C89-specified libc headers,
> (or msvcrt's versions with -mno-cygwin) ensures matching definitions.


This seems to be indeed the most compatible way. It looks like __need_* 
macros widely supported (not only by GCC itself, but also versions 
provided by mingw and LLVM). We may want to support that in our msvcrt 
headers, if we start using it.


However, it's not supported by MSVC. The fallback should still work, as 
you explained, but I wonder if it would be safer to guard stddef.h usage 
by defined(__GNUC__) and leave existing definitions for other 
configurations.


> Signed-off-by: Kevin Puetz <PuetzKevinA at JohnDeere.com>
> ---
>   include/basetyps.h |  8 +++++---
>   include/tchar.h    |  9 +--------
>   include/windef.h   | 11 +++++++----
>   3 files changed, 13 insertions(+), 15 deletions(-)
>
> diff --git a/include/basetyps.h b/include/basetyps.h
> index b0dd5d77f4..e6243d5a59 100644
> --- a/include/basetyps.h
> +++ b/include/basetyps.h
> @@ -91,9 +91,11 @@ typedef unsigned long error_status_t;
>   #endif
>   
>   #ifndef _WCHAR_T_DEFINED
> -#ifndef __cplusplus
> -typedef unsigned short wchar_t;
> -#endif
> +# ifndef __cplusplus
> +#  define __need_wchar_t // tells GCC's stddef.h to only define wchar_t


Please avoid C++ style comments. Wine uses /* */ comments.


Thanks,

Jacek




More information about the wine-devel mailing list