Boost logo

Boost :

From: Edward Diener (eddielee_at_[hidden])
Date: 2006-03-30 10:21:42

Since no one responded to this in the boost user group, I will post it
here in this group.

When compiling managed code in VC++ .NET, which is any of the /clr
compiler options, the programmer can mix both CLR classes and regular
C++ classes. In the regular C++ classes, Boost should work fine. The
VC++ macro which tells one that managed code of any kind is being
compiled is _MANAGED, which is defined if managed code is being compiled
else it is not defined. So when any of the /clr compiler options are
being used _MANAGED is defined, else it is not defined.

The VC++ compiler issues compiler warning C4561 whenever managed code is
being compiled and __fastcall shows up as a calling convention in any
way. Obviously the programmer can turn off this warning via a VC++
#pragma, but I am wondering if Boost could not change some of its
headers to avoid this warning. In Boost bind and mem_fn, the programmer
has to specifically ask for __fastcall support via special Boost macros
to have any functions declared with the __fastcall calling convention,
so nothing should be done there since it is clearly a programming error
if he does so while compiling managed code.

However there are two other places in Boost which I have discovered
where functions with the __fastcall calling convention are declared
without the programmer doing anything.

The first, and most cumbersome reagrding warning messages, is in
type_traits in the helper header files
type_traits\detail\is_mem_fun_pointer_tester.hpp and
type_traits\detail\is_function_pointer_tester.hpp. Since many other
libraries, lambda in my case recently, uses type_traits, might not these
headers be changed so that when VC++ is the compiler and _MANAGED is
defined, the __fastcall versions of these helper functions are not
declared ?

The second, which I have not encountered but which I saw while searching
through Boost header code, is in regex\config.h and I do not know, given
some other macros there, whether BOOST_REGEX_CALL can ever be __fastcall
when compiling with /clr, but if it can perhaps a change can be made
there also.

I know that it is not the purpose of Boost to try to accomodate C++ .NET
programmers creating /clr compilations using Boost, especially when just
warnings and not errors are issued. But in this case, using the
predefined macro _MANAGED in VC++ and BOOST_MSVC, it would seem this
acoomodation could be made. So I would like the Boost developers of
type_traits, especially since it is used by so many other Boost
libraries, and regex to consider it.

Boost list run by bdawes at, gregod at, cpdaniel at, john at