func预定义标识符
func返回所在函数的名字,例子如下:
#include <string>
#include <iostream>
using namespace std;
const char* hello() { return __func__; }
const char* world() { return __func__; }
int main(){
cout << hello() << "," << world() << endl; //输出 hello,world
}
对于上述的hello函数,编译期会处理成如下
const char* hello() {
static const char* __func__ = "hello";
return __func__;
}
_Prgama操作符
C/C++中,#pragma是一条预处理的指令(preprocessor directive)。简单来说#pragma是用来向编译期传达标准意外的一些信息的,如在头文件加入:
#pragma once
如果编译期支持该指令,则该头文件只被编译一次,效果与如下的宏效果一样:
#ifndef THIS_HEADER
#define THIS_HEADER
//一些头文件的定义
#endif
C++11中,标准定义了与#pragma功能相同的操作符_Prgama。如要实现与上面的#pragma效果一样,可以这么写:
_Pragma("once")
'#pragma是预处理指令,不能在宏中展开,但是_Pragma是操作符,可以展开,所以有更好的灵活性。
变长参数的宏定义以及VA_ARGS
变长参数的宏定义是指在宏定义中参数列表的最后一个参数为省略号,而预定义宏VA_ARGS则可以在宏定义的是实现部分替换省略号所代表的字符串。比如:
#define PR(...) printf(__VA_ARGS__)
下面是个简单的应用例子:
#include <stdio.h>
#define LOG(...) {\
fprintf(stderr,"%s: Line %d:\t", __FILE__, __LINE__);\
fprintf(stderr, __VA_ARGS__);\
fprintf(stderr, "\n");\
}
int main() {
int x = 3;
LOG("x=%d", x);
}
输出
/Users/zincle123/Desktop/develop/cWorkspace/CppTest/main.cpp: Line 59: x=3