This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: -fno-exceptions documentation


Howard Hinnant wrote:

Anyway, if you come up with a way to pull this off without having to
recompile op new (or another part of the lib) when flipping
exceptions on/off, that would really be cool! (your challenge for the
week ;-)).

The following appears to work for me.


functexcept.h:

#include <iostream>
#include <cstdlib>

template<class T> struct X
{
#ifndef _EXCEPTION_NEUTRAL

#ifdef __EXCEPTIONS

   static void throw_bad_alloc()
   {
       throw std::bad_alloc();
   }

#else

   static void throw_bad_alloc()
   {
       std::cerr << "Out of memory!\n";
       std::abort();
   }

#endif

#else

static void throw_bad_alloc();

#endif
};

#ifndef _EXCEPTION_NEUTRAL

template struct X<void>;

#endif

The actual throwing is done by using X<void>::throw_bad_alloc. The helper template is only necessary to give the correct "linkage" to throw_bad_alloc so that multiple definitions do not result in an error.

A compiled library that wishes to be "exception neutral" (such as libstdc++ itself) should #define _EXCEPTION_NEUTRAL and would receive no definition of throw_bad_alloc, leaving the calls unresolved.

User code just #includes the above header (indirectly via any libstdc++ include) and receives an appropriate (for the current __EXCEPTIONS setting) definition for X<void>::throw_bad_alloc because of the explicit instantiation.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]