Include的次序

今天解了一个问题.
main.c中的include中的次序是
#include "../dec_h/vt7218.h"
#include "../dec_h/ifunctin.h
#include "../dec_h/isystem.h"
 
第一个被include的是vt7218.h
 
在vt7218.h中, 会
首先判断__vt7218_H有没有被定义, 没有, 就把__vt7218_H给定义了
 
#ifndef __vt7218_H
#define __vt7218_H
 
然后:
#include "../dec_h/isystem.h"
 
and then, 在isystem.h中
首先判断__INTR_SYS_H有没有被定义, 没有, 就把__INTR_SYS_H给定义了
 
#ifndef __INTR_SYS_H
#define __INTR_SYS_H
 
然后:
#include "../dec_h/vt7218.h"
 
这时, 判断__vt7218_H已经被定义了, 就不会再include issystem.h了.
 
所以首先展开的是isystem.h
会执行:
#ifdef READ_AHEAD
#define  CMD_SET_READ_AHEAD                                 0xA7 /* 注意, 这时READ_AHEAD尚未被define */
#endif
然后展开vt7218.h
会执行:
#define READ_AHEAD                               // by Bruce  03/04/11 /* 这时, READ_AHEAD才被define了 */
所以这时你可以看到, 为什么在main.c中, CMD_SET_READ_AHEAD会未定义了
 
所以其实这三个include文件的正确顺序应该是:
#include "../dec_h/isystem.h"
#include "../dec_h/vt7218.h"
#include "../dec_h/ifunctin.h
issystem.h一定要在vt7218.h和ifunctin.h的上面include, 这样可以确保READ_AHEAD先被定义

总结:

include 本质上就是把文件的内容 copy paste 到相应的位置.
毕竟 C/C++ 的编译模型是基于文件单元的. 理解这点就明白 include 次序的含义了

按 Thinking in C++ 第2版第一卷的建议.
越特殊的 .h 越先 include 比较合适.
既, 先包含最特殊的, 当前 cpp 实现的类的类声明头文件
再包含自己实现的一些工具文件
再包含第3方库文件
再包含系统提供的头文件
再是标准头文件
另加一点, 最先包含配置文件, 即编译宏开关
<think>好的,我现在需要回答用户关于网络字节序(大端序)是什么以及如何在编程中处理的问题。首先,我应该回顾一下自己对这个主题的了解,并确保理解正确。 首先,网络字节序指的是在网络传输中使用的字节顺序。根据之前的引用内容,网络字节序采用大端模式(Big Endian)。大端序是指数据的高位字节存储在内存的低地址处,而低位字节存储在高地址处。例如,十六进制数0x1234,在大端模式下,0x12会放在低地址,0x34放在高地址。而主机字节序则可能因系统而异,有的是大端,有的是小端,比如常见的x86架构是小端模式。 接下来,用户想知道如何在编程中处理这个问题。我记得处理网络字节序通常涉及到字节序的转换函数,比如htonl、htons等。这些函数将主机字节序转换为网络字节序,或者反过来。例如,htonl用于将32位(长整型)的主机字节序转换为网络字节序,而htons用于16位(短整型)。同样,ntohl和ntohs则用于反向转换。 不过,我需要确认这些函数的正确性和用法,确保没有记错。例如,在C语言中,这些函数定义在<arpa/inet.h>头文件中。此外,在Python等高级语言中,可能使用struct模块的pack和unpack方法,并指定字节序,比如使用'>I'表示大端的32位无符号整数。 另外,还要考虑到不同数据类型的处理方式,比如整数、浮点数等,可能需要不同的转换方式。此外,如果主机字节序本身已经是网络字节序(即大端),那么这些转换函数可能不会做任何操作,但为了保证代码的可移植性,还是应该使用这些函数进行处理。 可能存在的情况是,用户在编程时没有正确处理字节序,导致不同系统间数据传输错误。例如,小端主机发送数据时如果不转换为大端,接收端如果是大端可能正确,但如果是小端就会出错。因此,必须强调转换的重要性。 还需要举一些具体的例子,比如如何用代码实现转换,或者如何处理多字节数据。例如,在C语言中发送一个整数,需要先用htonl转换,接收方再用ntohl转换回来。在Python中,使用struct.pack('>I', num)来打包成大端格式。 另外,可能需要提到网络协议如TCP/IP中使用大端序的原因,即为了保证不同系统之间的一致性,避免数据解析错误。 现在需要组织这些信息,按照用户的要求,结构清晰,分步骤解释,同时引用提供的参考资料。同时生成相关问题,确保符合用户指定的格式。</think>网络字节序(大端序)是网络通信中统一使用的数据存储格式,其核心特征是数据的高位字节存储在内存低地址,低位字节存储在高地址[^1]。例如,32位整数$0x12345678$按大端序存储为:$12\ 34\ 56\ 78$,而小端序则为$78\ 56\ 34\ 12$[^2]。 ### 编程中如何处理字节序? 1. **检测主机字节序** 通过代码判断当前系统字节序: ```c int is_little_endian() { int num = 1; return *(char *)&num == 1; // 返回1则为小端 } ``` 2. **使用标准转换函数** C语言提供以下函数进行主机序与网络序转换: ```c #include <arpa/inet.h> uint32_t htonl(uint32_t hostlong); // 32位整数主机转网络序 uint16_t htons(uint16_t hostshort); // 16位整数主机转网络序 uint32_t ntohl(uint32_t netlong); // 32位网络序转主机序 uint16_t ntohs(uint16_t netshort); // 16位网络序转主机序 ``` 3. **Python的字节序处理** 使用`struct`模块指定格式字符: ```python import struct # 大端32位无符号整数打包 packed = struct.pack('>I', 0x12345678) # 输出b'\x12\x34\x56\x78' # 解包大端数据 unpacked = struct.unpack('>I', packed)[0] ``` 4. **二进制协议设计** 协议字段需明确定义字节序,例如HTTP/2协议头部使用大端序编码。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值