第一章 兼容
预处理操作:文件包含、宏、条件编译
1.1 预定义宏__func__
预定义宏__func__
返回所在函数的名字const char*
const char* hello()
{
return __func__;
}
__FILE__
、__LINE__
、__TIME__
、__DATA__
int main()
{
cout << hello() << endl;
cout << __FILE__ << endl; //返回所在文件的名字
cout << __LINE__ << endl; //返回当前行号
cout << __TIME__ << endl; //返回当前编译时间
cout << __DATE__ << endl; //返回编译日期
return 0;
}
1.2 #pragma
#pragma once
放在头文件最前面,表示只编译一次,防止头文件被多次包含,等价于下面的#ifdef那一系列。
C++11中增加了操作符_Pragma {字符串字面值} _Pragma {"once"}
相比预处理指令,操作符可以放在宏中。更灵活一些吧,具体用到再说!
#pragma pack (n)
用来改变编译器内存对齐方式,这个就涉及到struct内变量如何对齐了。比较复杂,这里先简单引入一下。
默认pack(8)也即是八字节对齐,可以是1, 2, 4, 8, 16, …
struct 对齐规则:
- 整个内存大小是最大成员类型的整数倍
- 每个成员开始时都是该成员类型大小的整数倍
struct a
{
int a1; // 4
char a2; // 5
char a3; // 6
}; // 8
struct b
{
char b1; // 1
int b2; // 5
char b3; // 9
}; // 12