在 C/C++ 语言中特定的宏,__FUNCTION__ 等
2015-06-19 11:39
316 查看
对象反射库、调试工具及代码分析器,经常会需要在运行时访问函数的名称,直到不久前,唯一能完成此项任务并且可移植的方法,是手工在函数体内嵌入一个带有该函数名的硬编码字符串,不必说,这种方法非常单调无奇,并且容易导致错误。本文将要演示怎样使用新的C99特性,在运行时获取函数名。
那么怎样以编程的方式从当前运行的函数中得到函数名呢?
答案是:使用__FUNCTION__ 及相关宏。
作为一个C++程序员,可能经常遇到 __TIME__、__FILE__、__DATE__ 这样的宏,它们会在编译时,分别转换为包含编译时间、处理的转换单元名称及当前时间的字符串。
在最新的ISO C标准中,如大家所知的C99,加入了另一个有用的、类似宏的表达式__func__,其会报告未修饰过的(也就是未裁剪过的)、正在被访问的函数名。请注意,__func__不是一个宏,因为预处理器对此函数一无所知;相反,它是作为一个隐式声明的常量字符数组实现的:
static const char __func__[] = "function-name";
在function-name处,为实际的函数名。为激活此特性,某些编译器需要使用特定的编译标志,请查看相应的编译器文档,以获取具体的资料。
有了它,我们可免去大多数通过手工修改,来显示函数名的苦差事,以上的例子可如下所示进行重写:
void myfunc()
{
cout<<"__FUNCTION__"<<endl;
}
官方C99标准为此目的定义的__func__标识符,确实值得大家关注,然而,ISO C++却不完全支持所有的C99扩展,因此,大多数的编译器提供商都使用 __FUNCTION__ 取而代之,而 __FUNCTION__ 通常是一个定义为 __func__ 的宏,之所以使用这个名字,是因为它已受到了大多数的广泛支持。
#include "stdafx.h"
//__FILE__
//__LINE__
//__DATE__
//__TIME__
//__FUNCTION__
#include <iostream>
void fun()
{
std::cout<<__FUNCTION__<<std::endl;
std::cout<<__FILE__<<std::endl;
std::cout<<__LINE__<<std::endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
fun();
system("pause");
return 0;
}
对象反射库、调试工具及代码分析器,经常会需要在运行时访问函数的名称,直到不久前,唯一能完成此项任务并且可移植的方法,是手工在函数体内嵌入一个带有该函数名的硬编码字符串,不必说,这种方法非常单调无奇,并且容易导致错误。本文将要演示怎样使用新的C99特性,在运行时获取函数名。
那么怎样以编程的方式从当前运行的函数中得到函数名呢?
答案是:使用__FUNCTION__ 及相关宏。
作为一个C++程序员,可能经常遇到 __TIME__、__FILE__、__DATE__ 这样的宏,它们会在编译时,分别转换为包含编译时间、处理的转换单元名称及当前时间的字符串。
在最新的ISO C标准中,如大家所知的C99,加入了另一个有用的、类似宏的表达式__func__,其会报告未修饰过的(也就是未裁剪过的)、正在被访问的函数名。请注意,__func__不是一个宏,因为预处理器对此函数一无所知;相反,它是作为一个隐式声明的常量字符数组实现的:
static const char __func__[] = "function-name";
在function-name处,为实际的函数名。为激活此特性,某些编译器需要使用特定的编译标志,请查看相应的编译器文档,以获取具体的资料。
有了它,我们可免去大多数通过手工修改,来显示函数名的苦差事,以上的例子可如下所示进行重写:
void myfunc()
{
cout<<"__FUNCTION__"<<endl;
}
官方C99标准为此目的定义的__func__标识符,确实值得大家关注,然而,ISO C++却不完全支持所有的C99扩展,因此,大多数的编译器提供商都使用 __FUNCTION__ 取而代之,而 __FUNCTION__ 通常是一个定义为 __func__ 的宏,之所以使用这个名字,是因为它已受到了大多数的广泛支持。
#include "stdafx.h"
//__FILE__
//__LINE__
//__DATE__
//__TIME__
//__FUNCTION__
#include <iostream>
void fun()
{
std::cout<<__FUNCTION__<<std::endl;
std::cout<<__FILE__<<std::endl;
std::cout<<__LINE__<<std::endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
fun();
system("pause");
return 0;
}
相关文章推荐
- C++字符串输入数字输出
- C++12.4.1 构造函数(与类名相同,没有返回类型)----有初始化列表的构造函数
- C++ 构造函数,赋值构造函数,析构函数,赋值构造函数的调用次序
- Effective C++条款1
- 6.824 Lab4: Cache Locks回顾
- C++类使用构造函数初始化类表和构造函数函数体中赋值的区别
- 如何成为一个牛逼的C/C++程序员?
- Voronoi图简介及C语言实现
- C/C++程序员必须熟练应用的开源项目
- 游戏引擎开发之音乐播放(一)
- C++中cin、cin.get()、cin.getline()、getline()、gets()等函数的用法
- LeetCode 201. Bitwise AND of Numbers Range
- C++构造函数public,protected,private
- 几种C++ std::string和std::wstring相互转换的转换方法
- c++:变量,数组和指针
- c++求数组中的最小(大)的n位数
- 设计模式----------------简单工厂模式
- Effective C++ 条款1
- c++函数必须先声明在使用
- c++命名空间使用