VC++中的预定义宏

很多书里(包括《Thinking in C++》和《Effective C++》)都建议尽量减少使用#define宏,并用inline函数、cnost常量等代替。但很多项目代码中还是大量使用宏:甚至有的代码用宏来构造自定义类(gtest中就有类似的用法);用#if…#else…#endif来改变程序实现、函数声明等。前一段时间读程序就遇到过一个这样的代码,全部代码都在头文件中并用#if…#else…#endif实现两个版本。

确实C++中的预定义宏可以方便地实现某些功能,但不同编译器的预定义宏格式有区别。
GNU C++和VC++就有一些不同之处:
———————————————————
GNU C++                                    VC++
STRING                                         #
__PRETTY_FUNCTION_         __FUNCTION

———————————————————-
VC++中的预定义宏包括ANSI预定义宏和Microsoft额外提供的一些预定义宏。
MSDN 《Predefined Macros》
列几个有用的:
**__FILE__  ** 当前源文件名
******__LINE__  ** 当前源文件中的函数
下面几个与函数有关
**__FUNCDNAME__    **修饰过(decorated )的函数名字符串
******__FUNCSIG__          ** 函数签名式字符串
****__FUNCTION__        未修饰过的函数名字符串
下面几个与版本有关
_MSC_VER
****_MSC_FULL_VER
****_MFC_VER
****_CPPLIB_VER
****没怎么用过,可以用_MSC_VER来区分编译器版本。