__func__预定义标识符
__func__返回所在函数的名字, 也可以使用于类和结构体中.
例如
const char * hello() { return __func__; } 返回 "hello"
struct TestStruct {
TestStruct () : name (__func__) {}
const char * name;
};
但是, 不可将其用作函数参数的默认值, 因为__func__在函数声明时还未被定义
void FuncFail (string func_name =__func__) {}; // 无法通过编译
_Pragma标识符
使用方法: _Pragma(字符串字面量)
_Pragma("once") #pragma once #ifndef THIS_HEADER_ #define THIS_HEADER_ #endif
在头文件中效果相同, 表示所在头文件只被编译一次.
相比 #pragma, _Pragma可以使用于一些宏中:
#define CONCAT(x) PRAGMA (concat on #x)
#define PRAGMA(x) _Pragma(#x)
CONCAT( ..\concat.dir ) 最终会产生 _Pragma(concat on "..\concat.dit")这样的效果.
变长参数的宏定义以及 __VA_ARGS__
变长参数的宏定义是指在宏定义中参数列表的最后一个参数为省略号, 而预定义宏__VA_ARGS__
则可以在宏定义的实现部分替换省略号所代表的字符串, 例如:
#define PR(...) printf(__VA_ARGS__)
定义了printf 的一个别名 PR.
宽窄字符串的连接
在将窄字符串和宽字符串进行连接时, 支持c++11标准的编译器会将窄字符串转换为宽字符串后再进行连接.