有关编译器组态设置,由于自己在阅读这一块代码时,老是有许多纠结,所以为了让自己记住一个关键点:有关编译器的组态设置,并非完全精确地针对某些特定编译器,具体移植时, 是需要做适当修改的。特此记录个人想法及思索过程。
比如对于:
#if defined( __sgi ) && !defined( __GNUC__ ) #if !defined( _BOOL ) define __STL_NEED_BOOL #endif #if !defined( _TYPENAME_IS_KEYWORD ) define __STL_NEED_TYPENAME #endif #ifdef _PARTIAL_SPECIALIZATION_OF_CLASS_TEMPLATES define __STL_CLASS_PARTIAL_SPECIALIZATION #endif ... #endif
个人的理解是,这段代码的真的目的并不是为了说明,定义了__sgi而没有定义 __GNUC__的编译器就必须进行接下来测试,即如果没有定义_BOOL则定义__STL_NEED_BOOL, 诸如此类。
因为如果按这种方向去理解的话,我就会因此而误解为:SGI库本身有定义__sgi,而GNUC编译器本身也有定义__GNUC__(实际上在GCC中测试时,是没有定义__sgi的,但有定义__GNUC__),进而认为使用了SGI库而又不使用GCC的其他编译器就必定通过这一条件编译,并进行接下来的条件编译测试,甚至认为如果该编译器支持bool功能,则它内部必定默认有_BOOL预定义标识符,但实际上是不一定的。比如VC中如果使用SGI的话,暂且不论它是否定义了__sgi, 就_BOOL而言,经测试是没有定义,但VC中有bool功能,所以如果VC中要正常使用SGI必须对SGI的config头文件进行适当修改,或在自身开发环境中,添加相应预定义标识符。
综上,为了让自己更好的理解stl_congig.h文件,我这样去这段示例代码:若编译器使用了SGI而本身不是GCC,则判断是否具有bool功能,没有则指明需要该功能,…… 如果是GCC则不用进行这些测试,因为GCC本身是支持的。所以其真正目的在于说明一个含义,并非具体代码的执行,具体对于不同编译器,还是需要作修改的,诸如修改stl_config.h,或为编译器本身添加预定义标识符。
以上,是为了帮助自己理解而作的记录,有些地方不知所云,只供自己理解,未必适合他人,还请见谅!