编译器编译时发现了头文件重复包含的问题,如何解决?
- 使用#ifndef
- 使用#pragma once
方式一:
#ifndef __SOMEFILE_H__
#define __SOMEFILE_H__
... ... // 声明、定义语句
#endif
方式二:
#pragma once
... ... // 声明、定义语句
#pragma pack(n)
在了解它之前,我们先来搞懂结构体的存储方式。
//假设定义了一个这样的结构体s
struct s {
char ch;
int i;
};
此时我们使用sizeof输出结构体的大小,猜猜会是多少?
char是1个字节、int是4个字节
那么按照我们的设想,应该输出5,但是编译器却输出了8
这是为什么?
编译器为了让程序跑得更快,减少CPU读取数据的指令周期,对结构体的存储进行优化。本来char是1字节,但是这里为了使int成员的地址能够被4整除,所以将char也变为了4字节。
如果此时我们使用了pragma pack(1)对它进行限定
那么#pragma pack(1)代表了数据在内存中的对齐数据为1,那么编译器就会将结构体强制连续排列。此时输出结构体的大小,就是5.
网友评论