On Monday 30 December 2024 15:32:16 Martin Storsjö wrote:
> On Thu, 12 Dec 2024, Martin Storsjö wrote:
> 
> > On Thu, 12 Dec 2024, LIU Hao wrote:
> > 
> > > 在 2024-12-12 21:17, Martin Storsjö 写道:
> > > > On Thu, 28 Nov 2024, Pali Rohár wrote:
> > > > > msvcrt.dll preinstalled as part of the Windows system provides more
> > > > > functions than the original Visual C++ 6.0, but still it is
> > > > > compatible with
> > > > > the original version. So setting __MSVCRT_VERSION__ to 0x600
> > > > > for msvcrt.dll
> > > > > build is relatively sane option.
> > > > > 
> > > > > I was considering to use 0x6FF value for this case, but this
> > > > > would make it
> > > > > more complicated for applications if they need to know if they are 
> > > > > being
> > > > > compiled for msvcrt.dll library ABI. They would need to
> > > > > check if the macro
> > > > > __MSVCRT_VERSION__ is set to 0x600 (targetting the original
> > > > > VC++ msvcrt.dll
> > > > > library) or to value 0x6FFF (targettting the system msvcrt.dll 
> > > > > library).
> > > > > This looks to be additional complication as it would be
> > > > > needed to track all
> > > > > possible values for __MSVCRT_VERSION__. So using just one value 0x600 
> > > > > for
> > > > > both cases should be enough because for system version
> > > > > specific version is
> > > > > always needed to check also _WIN32_WINNT value.
> > > > 
> > > > I think this change looks reasonable to me, but I'd like Liu
> > > > Hao, who suggested the 0x6FF version, to follow up here.
> > > 
> > > I'm fine with this change, too.
> > 
> > Thanks, I pushed this one now then.
> 
> It turns out that this change did cause some breakage in user projects - see
> https://github.com/msys2/MINGW-packages/pull/22907.
> 
> Also see 
> https://codesearch.debian.net/search?q=if.*__MSVCRT_VERSION__.*0x0*%5B76%5D&literal=0&page=2
> - it seems that there are a number of other projects that also have
> conditionals relating to this, which also may run into trouble.
> 
> (E.g. with old mingw.org headers, functions like _aligned_malloc used to be
> guarded within "#if __MSVCRT_VERSION__ >= 0x0700", so some projects either
> check __MSVCRT_VERSION__ to know whether it is available, or even try to set
> __MSVCRT_VERSION__ themselves in order to opt in to using such functions,
> that were available in msvcrt.dll since XP.)
> 
> Not saying that this requires revisiting our decision, but it may cause some
> amount of confusion and breakage in existing user code out there.
> 
> // Martin

That is not good. But I do not know what can be done better. If the
application is using #if __MSVCRT_VERSION__ >= ... and one of the
preprocessor branch result in broken compiled application then it is
obviously bug in application.

But I do not know what to do with it. Either we need to say that the
whole __MSVCRT_VERSION__ macro is now broken because it is wrongly used
by applications and we should rather deprecate it (by providing some
fixed value to let application compile) and create a new macro e.g.
__MSVCRT_VERSION_REAL__ which would contain the real version.

Or we need to say that it is application bug and do not care about it.

Or maybe completely remove __MSVCRT_VERSION__ macro and always provides
all function declarations in header files.

But I think that any of those options just cause new problems. This does
not have a sane solution at all.

Whatever solution is chosen, I would propose to put big warning into
release notes what is happening and how application code could be
adjusted.


_______________________________________________
Mingw-w64-public mailing list
Mingw-w64-public@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

Reply via email to