4.12.2 BOOST_CURRENT_FUNCTION
微软编译器(VC)在C89的__FILE__和__LINE__之外定义了一些扩展宏,其中的__FUNCTION__宏可以表示函数名称,GCC、intel C等编译器也定义有类似的宏,而C99标准则定义了__func__宏以实现同样的功能。但目前的C++(www.cppentry.com)98标准不能这样做。
BOOST_CURRENT_FUNCTION宏为C++(www.cppentry.com)补充了这个功能,而且功能更强大,更具可移植性。
用法
为了使用BOOST_CURRENT_FUNCTION宏,需要包含<boost/current_function. hpp>,即:
- #include <boost/current_function.hpp>
只需要在代码中使用BOOST_CURRENT_FUNCTION宏,就可获得包含该宏的外围函数名称,它表现为一个包含完整函数声明的编译期字符串。如果BOOST_CURRENT_FUNCTION宏不处于任何函数作用域之内,则行为依编译器而不同(在VC上会报出编译错误)。
示范BOOST_CURRENT_FUNCTION宏用法的代码如下:
- double func()
- {
- cout << BOOST_CURRENT_FUNCTION << endl;
- return 0.0;
- }
- //string str = BOOST_CURRENT_FUNCTION;//err
- int main()
- {
- cout << __FUNCTION__ << endl;
- cout << BOOST_CURRENT_FUNCTION << endl;
- func();
- }
程序在VC8编译后运行结果如下:- main
- int __cdecl main(void)
- double __cdecl func(void)
实现原理
读者可能会惊讶于BOOST_CURRENT_FUNCTION宏的奇特魔力,其实BOOST_ CURRENT_FUNCTION宏并不神秘。它的实现代码实际上相当地简单,仅仅是针对各种编译器把编译器特定的宏定义为BOOST_CURRENT_FUNCTION,因此它的能力完全依赖于编译器。
例如对于VC:
- # define BOOST_CURRENT_FUNCTION __FUNCSIG__
而GCC则是:- # define BOOST_CURRENT_FUNCTION __PRETTY_FUNCTION__
虽然BOOST_CURRENT_FUNCTION的功能和实现都很简单,但它的确为函数名称的显示提供了一个通用的解决办法,在配合抛出异常或者输出诊断日志时非常有用。