c语言预处理命令u8u16,struct结构里的#define定义

预编译(预处理)就是在正式编译之前的,为正式编译做准备,处理以#开头的指令。

1, 在看linux内核代码时会看到某些结构体的定义中包含宏定义:

第一次看到觉得怪怪的,虽然我知道宏定义作用于开始定义处,结束于#undef。网上也看到一些人的疑问,比如:

a) 如果去定义这样的结构体变量,会不会导致一个宏重复定义。

b) 既然这样没错误,那么有什么好处。

2.    通过看如下程序预编译前后的结果:

预编译前:

执行命令:gcc main.c -E > main.E

预编译后:

结论:

预编译时,宏被展开,宏定义处被拿掉了,所以接下来再用struct

mystr来定义变量时,里面的宏已经不存在了,所以并不会导致一个宏重复被定义。至于这样编写代码的好处,有人说是增加代码的可阅读性,让人知道这些宏只会用于这个结构体中,还有就是便于对这个结构体进行扩展。

3,对于宏编译结构体的扩张的理解如下:

#define CV_SEQUENCE_FIELDS() \

do{

int flags; \

int header_size; \

struct CvSeq* h_prev; \

struct CvSeq* h_next; \

struct CvSeq* v_prev; \

struct CvSeq* v_next; \

int total; \

int elem_size; \

char* block_max; \

152 CHAPTER 1. CXCORE

char* ptr; \

int delta_elems; \

CvMemStorage* storage; \

CvSeqBlock* free_blocks; \

CvSeqBlock* first;

}while(0)

typedef struct CvSeq

{

CV_SEQUENCE_FIELDS();

} CvSeq;

这是opencv里面的CV_Seq结构体的定义方式,使用宏CV_SEQUENCE_FIELDS()进行定义,这种定义方式有助于用户进行自行扩展。如果想在结构体里面再加入些东西,可以直接使用:

typedef struct Myseq

{

CV_SEQUENCE_FIELDS();

type1 variable1;

type2 variable2;

} Myseq;

这种形式进行定义。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值