// -*- mode:C++; tab-width:2; c-basic-offset:2; indent-tabs-mode:nil -*- // // Copyright (C) 2000-2005 by Roger Rene Kommer / artefaktur, Kassel, Germany. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public License (LGPL). // // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // License ACDK-FreeLicense document enclosed in the distribution // for more for more details. // This file is part of the Artefaktur Component Development Kit: // ACDK // // Please refer to // - http://www.acdk.de // - http://www.artefaktur.com // - http://acdk.sourceforge.net // for more information. // // $Header: /cvsroot/acdk/acdk/acdk_core/src/acdk/Compiler.h,v 1.35 2005/04/26 12:52:47 kommer Exp $ #ifndef acdk_Compiler_h #define acdk_Compiler_h #include "Platform.h" #if defined(DOXYGENONLY) // documentation only // general compiler flags /** ACDK_SUPPORT_ANSI_SPECIALIZATION use template <> void foo(char c) instead of template <char> void foo(char c) @ingroup acdkplatformmacros */ #define ACDK_SUPPORT_ANSI_SPECIALIZATION /** and,or,xor, etc. are reserved token @ingroup acdkplatformmacros */ #define ACDK_HAS_ALTERNATIVE_TOKEN /** is defined if compiler needs explicite type in function templates @code template <class T> void foo() { T dummy; #ifdef ACDK_ALT_CALL_TEMPLATED_FUNCTION anotherMemberTemplate<T>(dummy); #else anotherMemberTemplate(dummy); #endif } @endcode @ingroup acdkplatformmacros */ #define ACDK_ALT_CALL_TEMPLATED_FUNCTION /** If reference to super class needs fully qualified name @code namspace somewhere { class A { void foo() { } }; } class B : public somewhere::A { void foo() { #ifdef ACDK_NEED_FQ_SUPER_QUALIFIER somewhere::A::foo(); #else A::foo(); #endif } }; @endcode @ingroup acdkplatformmacros */ #define ACDK_NEED_FQ_SUPER_QUALIFIER /** See code example. @code template <class A> struct X { template <class B> void foo(B& b); }; #if defined(ACDK_MEMBERTEMPL_TEMPLATE_TEMPLATE) template <class A> template <class B> #else template <class A, class B> #endif void X<A>::foo(B& b) {} @endcode @ingroup acdkplatformmacros */ #define ACDK_MEMBERTEMPL_TEMPLATE_TEMPLATE /** template_static is used to mark a template member function as static. @ingroup acdkplatformmacros */ #define template_static static /** is defined if null pointer checking will be done by structured C exception or signal handling @ingroup acdkplatformmacros */ #define ACDK_NO_NULLPOINTER_CHECKING /** is defined if platform need to export shared library symbols (Windows) @ingroup acdkplatformmacros */ #define ACDK_NEED_DLLEXPORT /** is defined if compiler supports user defined delete operator @ingroup acdkplatformmacros */ #define ACDK_HAS_USER_DEFINDED_OPERATOR_DELETE /** is defined if compiler include has struct timeval @ingroup acdkplatformmacros */ #define ACDK_HAS_STRUCT_TIMEVAL /** is defined if compiler has long long type @ingroup acdkplatformmacros */ #define ACDK_HAVE_LONG_LONG /** Used to export a member/method/class from a DLL/SO @ingroup acdkplatformmacros */ #define ACDK_DLL_EXPORT __declspec(dllexport) /** Used to import a member/method/class from a DLL/SO @ingroup acdkplatformmacros */ # define ACDK_DLL_IMPORT __declspec(dllimport) /** Used to hide symbol from exported symbols (private to DLL/SO). This will probably be supported by gcc 4.x @ingroup acdkplatformmacros */ # define ACDK_DLL_PRIVATE #endif //defined(DOXYGENONLY) documentation only /** Used to add throwing declarations to methods for example: @code void foo() THROW1(RMyException) @endcode with will be expanded to @code void foo() throw(RMyException, ::acdk::lang::RThrowable) @endcode On some platform this macro expands to nothing (due buggy C++ implementation @ingroup acdkkeywords @ingroup acdkmacros */ #define THROWS1(ex) throw(ex, ::acdk::lang::RThrowable) /** @see THROWS1 @ingroup acdkkeywords @ingroup acdkmacros */ #define THROWS2(ex1, ex2) throw(ex1, ex2, ::acdk::lang::RThrowable) /** @see THROWS1 @ingroup acdkkeywords @ingroup acdkmacros */ #define THROWS3(ex1, ex2, ex3) throw(ex1, ex2, ex3, ::acdk::lang::RThrowable) /** @see THROWS1 @ingroup acdkkeywords @ingroup acdkmacros */ #define THROWS4(ex1, ex2, ex3, ex4) throw(ex1, ex2, ex3, ex4, ::acdk::lang::RThrowable) #if defined(OS_DARWIN) || defined(__BORLANDC__) # undef THROWS1 # define THROWS1(ex) # undef THROWS2 # define THROWS2(ex1, ex2) # undef THROWS3 # define THROWS3(ex1, ex2, ex3) # undef THROWS4 # define THROWS4(ex1, ex2, ex3, ex4) #endif //defined(OS_DARWIN) || defined(__BORLANDC__) // ================================================================= // Compiler Settings // ================================================================= // // MS VC6 Compiler // #ifdef _MSC_VER # pragma warning(disable: 4100) // vc8 memcpy, etc. are not secure warnings # define _CRT_SECURE_NO_DEPRECATE # define WIN32_THREADS # define ACDK_SUPPORT_ANSI_SPECIALIZATION # define ACDK_HAS_USER_DEFINDED_OPERATOR_DELETE # define template_static static # define ACDK_NEED_DLLEXPORT // use structured exception handling # define ACDK_USE_MSC_STRUCTURED_C_HANDLING 1 # if defined(ACDK_USE_MSC_STRUCTURED_C_HANDLING) # define ACDK_NO_NULLPOINTER_CHECKING 1 # endif //ACDK_USE_MSC_STRUCTURED_C_HANDLING /** understand following: template <typename T> inline StringConcenator operator+(const char* s1, const T& t) */ # define ACDK_HAS_OPERATORS_ON_BASICS_ONLY # if _MSC_VER >= 1300 /** does not understand following template <class OT> explicit RefHolder(const RefHolder<OT>& other); RefHolder(const RefHolder<T>& other); */ # define ACDK_NO_EXPLICIT_OVERLOADING_BUG 1 # endif //_MSC_VER >= 1300 # if _MSC_VER >= 1400 // VC8 aka Visual Studio 2005 # define ACDK_NEED_FQ_SUPER_QUALIFIER # pragma warning(disable: 4290) // C++ exception specification ignored except to indicate a function is not __declspec(nothrow) # pragma warning(disable: 4250) // 'acdk::lang::Integer' : inherits 'acdk::lang::acdk::lang::Object::acdk::lang::acdk::lang::Object::_getObjectPtr' via dominance # pragma warning(disable: 4251) // 'acdk::util::BucketNode::_next' : class 'RefHolder<T>' needs to have dll-interface to be used by clients of class 'acdk::util::BucketNode' # pragma warning(disable: 4996) // 'write' was declared deprecated # endif /FONT> # define ACDK_DLL_EXPORT __declspec(dllexport) # define ACDK_DLL_IMPORT __declspec(dllimport) # define ACDK_DLL_PRIVATE #endif //_MSC_VER /** is true if either not gcc or at least version Major.Minor */ #define ACDK_CHECK_GCC_VERSION(Major, Minor) \ ((!(defined(__GNUC__)) || (__GNUC__ > Major) || ((__GNUC__ == Major) && (__GNUC_MINOR__ >= Minor)))) //////////////////////////////////////////////////////////////////////// // Gnu-Compiler. egcs 1.1.2, gcc 2.95.1 - 3.4 // #ifdef __GNUG__ # if !defined(__alpha__) && !defined(__ppc__) && !defined(__amd64__) # define ACDK_NO_SIZE_T 1 # endif /FONT> # ifdef _LONGLONG # define ACDK_INT64BIT # endif /FONT> # define HAS_UNISTD_H 1 # define ACDK_HAS_STRUCT_TIMEVAL 1 # define ACDK_HAVE_LONG_LONG 1 # define ACDK_HAS_USER_DEFINDED_OPERATOR_DELETE # define template_static static // gcc 2.95.1 doesn't support it # define ACDK_SUPPORT_ANSI_SPECIALIZATION // gcc 3.0 has alternate token 'and' 'or' and so on # define ACDK_HAS_ALTERNATIVE_TOKEN # if ACDK_CHECK_GCC_VERSION(3, 4) # define ACDK_MEMBERTEMPL_TEMPLATE_TEMPLATE # endif /FONT> // needed to get recursive mutex # ifndef _GNU_SOURCE # define _GNU_SOURCE # endif /FONT> # if defined(ACDK_OS_WIN32) || defined(ACDK_MINGW) # if !defined(ACDK_MINGW) # define ACDK_MINGW # endif /FONT> # if !defined(ACDK_OS_WIN32) # define ACDK_OS_WIN32 # endif /FONT> # define ACDK_NEED_DLLEXPORT # define WIN32_THREADS # define ACDK_DLL_EXPORT __declspec(dllexport) # define ACDK_DLL_IMPORT __declspec(dllimport) # define ACDK_DLL_PRIVATE # else // defined(ACDK_OS_WIN32) # if ACDK_CHECK_GCC_VERSION(4, 0) # define ACDK_DLL_EXPORT __attribute__ ((visibility("default"))) //# define ACDK_DLL_IMPORT __attribute__ ((visibility("hidden"))) # define ACDK_DLL_IMPORT # define ACDK_DLL_PRIVATE # else /FONT> # define ACDK_DLL_EXPORT # define ACDK_DLL_IMPORT # define ACDK_DLL_PRIVATE # endif //ACDK_CHECK_GCC_VERSION(4, 0) # endif // defined(ACDK_OS_WIN32) #endif //__GNUG__ //////////////////////////////////////////////////////////// // Borland C++-Builder 4/5 // #ifdef __BORLANDC__ // Borland 5.51 __BORLANDC__ == 0x551 # ifndef __linux__ # define WIN32_THREADS # define ACDK_NEED_DLLEXPORT # else /FONT> # define POSIX_THREADS # define ACDK_ATOMIC_USE_PTHREAD # endif //__linux__ # define ACDK_SUPPORT_ANSI_SPECIALIZATION # define ACDK_NO_ARRAY_DELETE # define ACDK_NEED_FQ_SUPER_QUALIFIER # if __BORLANDC__ >= 0x600 # define template_static # else /FONT> # define template_static static # endif //__BORLANDC__ >= 0x600 # define ACDK_DLL_EXPORT __declspec(dllexport) # define ACDK_DLL_IMPORT __declspec(dllimport) # define ACDK_DLL_PRIVATE # define ACDK_MEMBERTEMPL_TEMPLATE_TEMPLATE /** borland sometime has problems with RThrowable and other Holder to Exceptions while linking. ACDK_BCC_RTHROWABLE_DEFINITION fixes this. @ingroup acdkplatformmacros */ # define ACDK_BCC_RTHROWABLE_DEFINITION(ClassName) \ namespace { \ void bcc##ClassName##Fix() \ { \ try { \ throw R##ClassName(new ClassName()); \ } catch (R##ClassName ex) { \ } \ } \ } # define ACDK_BCC_RTHROWABLE_DEFINITION_FQ(ns, ClassName) \ namespace { \ void bcc##ClassName##Fix() \ { \ try { \ throw ns R##ClassName(new ns ClassName()); \ } catch (ns R##ClassName ex) { \ } \ } \ } #else //__BORLANDC__ # define ACDK_BCC_RTHROWABLE_DEFINITION(ClassName) # define ACDK_BCC_RTHROWABLE_DEFINITION_FQ(ns, ClassName) #endif //__BORLANDC__ //////////////////////////////////////////////////////////// // Sun WorkShop 6 // #if defined(__SUNPRO_CC) // # define ACDK_SUPPORT_ANSI_SPECIALIZATION # define POSIX_THREADS # define HAS_UNISTD_H 1 # define ACDK_HAS_STRUCT_TIMEVAL 1 # define ACDK_HAVE_LONG_LONG 1 # define ACDK_HAS_USER_DEFINDED_OPERATOR_DELETE # define ACDK_ALT_CALL_TEMPLATED_FUNCTION # define ACDK_HAS_ALTERNATIVE_TOKEN # define template_static static // this will cause an warning, but otherwise there will be an error # define ACDK_DLL_EXPORT # define ACDK_DLL_IMPORT # define ACDK_DLL_PRIVATE #endif // __SUNPRO_CC // // Metroworks // #if defined(__MWERKS__) # define ACDK_OS_WIN32 # define ACDK_METROWORKS # define WIN32_THREADS # define ACDK_SUPPORT_ANSI_SPECIALIZATION # define ACDK_HAS_USER_DEFINDED_OPERATOR_DELETE # define ACDK_HAS_ALTERNATIVE_TOKEN # define template_static static # define ACDK_DLL_EXPORT # define ACDK_DLL_IMPORT # define ACDK_DLL_PRIVATE #endif //defined(__MWERKS__) // // Intel CC 6.0 Linux // #if defined(__INTEL_COMPILER) # define ACDK_SUPPORT_ANSI_SPECIALIZATION # define ACDK_HAS_USER_DEFINDED_OPERATOR_DELETE # define ACDK_HAS_ALTERNATIVE_TOKEN # define template_static static # if !defined(ACDK_OS_WIN32) # define HAS_UNISTD_H 1 # endif /FONT> # define ACDK_DLL_EXPORT # define ACDK_DLL_IMPORT # define ACDK_DLL_PRIVATE #endif //defined(__INTEL_COMPILER) #if (defined(ACDK_OS_LINUX) || defined(ACDK_OS_SOLARIS)) && !defined(ACDK_OS_CYGWIN32) # ifndef POSIX_THREADS # define POSIX_THREADS # endif /FONT> #endif //OS_LINUX #if defined(ACDK_OS_CYGWIN32) || defined(_MSC_VER) || (defined(__BORLANDC__) && !defined(__linux__)) # define WIN32_THREADS #endif /FONT> #ifdef WIN32_THREADS # define ACDK_WIN32_THREADS #endif /FONT> #ifdef POSIX_THREADS # define ACDK_POSIX_THREADS #endif /FONT> /** ACDK_FQ_SUPER_QUALIFIER is a helper macro to select super class in initialization list: @code struct A : public ::otherns::B { A() : ACDK_FQ_SUPER_QUALIFIER(::otherns::, B()) { } }; @endcode @see ACDK_NEED_FQ_SUPER_QUALIFIER @ingroup acdkplatformmacros */ #ifdef ACDK_NEED_FQ_SUPER_QUALIFIER # define ACDK_FQ_SUPER_QUALIFIER(namespace, class) namespace class #else /FONT> # define ACDK_FQ_SUPER_QUALIFIER(namespace, class) class #endif /FONT> #endif //acdk_Compiler_h |