__func__预定义标识符,_Pragma操作符,__VA_ARGS__
__func__预定义标识符
1.功能
返回所在函数的函数名称。__func__预定义标识符在轻量级的调试代码中具有十分重要的作用,而在C++11中标准运行使用在类或结构体制。
2.举例
在VS2012中,func__为__FUNCTION,使用例程如下:
#include <iostream>
#include <string>
using namespace std;
const char* function_name(){ return __FUNCTION__;}
//实际的定义过程如下
/*
const char* function_name(){
const static char* __FUNCTION__="function_name"'
return __FUNCTION__;
}
*/
int main()
{
cout<<function_name()<<","<<endl;
return 0;
}
在结构体中的应用:
#include <iostream>
#include <string>
using namespace std;
struct FuncStruct{
FuncStruct():name(__FUNCTION__){}
const char* name;
};
int main()
{
FuncStructft;
cout<<ft.name<<endl; //FuncStruct::FuncStruct
return 0;
}
__func__标识符不能作为函数参数的默认值
void FuncFail(string func_name = __FUNCTION__); //编译报错,
错误原因为在函数声明时,__func__标识符还未定义。
_Pragma操作符
#pragma 是一条预处理指令。
#pragma once
上述指令为指示编译器(若编译器支持),该头文件只被编译一次,和以下代码达到的效果一样。
#ifndef DEFINE
#define DEFINE
//
#endif
在C++11中,_Pragma操作符与#pragma预处理指令具有同样的功能。
_Pragma(“字符串常量”)
_Pragma(“once”) => #pragma once
_Pragma是一个操作符,因此可以将_Pragma应用于宏中。
VA_ARGS
变长参数的宏定义是指宏定义中的参数列表的最后一个参数为省略号,__VA_ARGS__预定义宏可实现部分替换省略号所代表的字符串。比如
#define PR(…) printf(VA_ARGS) 为printf定义一个别名PR。