John Maddok wrote: >Another problem (I think) is that with BOOST_STATIC_ASSERT you know compilation will >stop.
>However, a BOOST_STATIC_WARNING would keep re-apearing in each translation unit >#including your file: >// boost_file.hpp >BOOST_STATIC_WARNING( "we're in boost_file.hpp") >// file1.hpp >#include <boost/boost_file.hpp> >-- appears here >// file2.hpp >#include <boost/boost_file.hpp> a) BOOST_STATIC_WARNING only appears once since include files are guarded by #ifdef .... #define ... #endif BOOST_STATIC_ASSERT doesn't stop compilation. It only appears once for the same reason that BOOST_STATIC_WARNING does. Here is my best effort at BOOST_STATIC_WARNING. It suffers from the followng deficiencies: a) On a Microsoft platform it only works within a function definition. b) It gives a warning that points to the exact line, BUT doesn't have a particularly eye catching message Other than that, it seems to work as one would hope. Robert Ramey // (C) Copyright Robert Ramey 2003. // Permission to copy, use, modify, sell and // distribute this software is granted provided this copyright notice appears // in all copies. This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // See http://www.boost.org/libs/static_assert for documentation. /* Revision history: 15 June 2003 Initial version. */ #ifndef BOOST_STATIC_WARNING_HPP #define BOOST_STATIC_WARNING_HPP #include <boost/config.hpp> namespace boost { // used to generate warning template<const char *T> struct WARNING_MESSAGE; template<bool> class STATIC_WARNING; template<> class STATIC_WARNING<false> { typedef char type; }; template<> class STATIC_WARNING<true> { typedef int type; }; } // boost // Implemenation // this implementation relies on the warning issued by compilers // when a constant is truncated. If the boolean is false, the // compiler emits a warning message. The warning message points // to the point where the macro was invoked. The warning message // indicates data lost in an integral conversion. Unfortunately, // we have yet to discover an way to invoke a more eye catching // warning message a la BOOST_STATIC_ASSERT. #if defined(BOOST_MSVC) // __LINE__ macro broken when -ZI is used see Q199057 // Sooo for this compiler this only works inside a function #define BOOST_STATIC_WARNING(B) \ {static_cast< ::boost::STATIC_WARNING< (bool)(B) >::type >(0xffff);} #else #define BOOST_STATIC_WARNING(B) \ enum { \ BOOST_JOIN(boost_static_warning_enum_, __LINE__) \ = static_cast< ::boost::STATIC_WARNING< (bool)(B) >::type >(0xffff) \ } #endif #endif // BOOST_STATIC_WARNING_HPP /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 // test_static_warning.cpp: // (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . Permission to copy, // use, modify, sell and distribute this software is granted provided this // copyright notice appears in all copies. This software is provided "as is" // without express or implied warranty, and with no claim as to its suitability // for any purpose. #include <boost/static_warning.hpp> #if ! defined(BOOST_MSVC) BOOST_STATIC_WARNING(false); BOOST_STATIC_WARNING(true); #endif int test_main( int argc, char* argv[] ) { BOOST_STATIC_WARNING(true); BOOST_STATIC_WARNING(false); return 0; } _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost