#pragma、#error指令你用过吗?

本篇笔记分享两个冷门却又不冷门的预处理指令。冷门是因为我们平时可能比较少用(或者说我们的编码能力还没到需要注重这些细节的水平),不冷门是因为这几个指令在一些优秀的C代码中用得很多。比如在Linux内核代码中:

#pragma、#error指令你用过吗?

#pragma、#error指令你用过吗?


#error指令

#error 指令让预处理器发出一条错误信息,并且会中断编译过程。下面我们从Linux代码中抽取出来一小段代码并做修改得到示例代码:

#pragma、#error指令你用过吗?

这段示例代码很简单,当RX_BUF_IDX宏的值不为0~3时,在预处理阶段就会通过#error 指令输出一条错误提示信息:

"Invalid configuration for 8139_RXBUF_IDX"

下面编译看一看结果:

#pragma、#error指令你用过吗?

不清楚C语言编译的几个阶段的朋友可以阅读往期笔记:【C语言笔记】C语言的编译过程

#pragma指令

#pragma指令应该是预处理指令中最复杂,其用法很多。下面简单看一下常见用法。

1、#pragma pack

我们可以利用#pragma pack来改变编译器的对齐方式:

#pragma pack(n)  /* 指定按n字节对齐 */
#pragma pack()   /* 取消自定义字节对齐 */

下面依旧以示例来说明。我们在之前的文章:经典、易错的结构体内存对齐的文章中也有提到结构体对齐的问题,那篇笔记我们没有自定字节对齐,按照编译器默认的对齐方式,代码为:

#pragma、#error指令你用过吗?

运行结果为:

#pragma、#error指令你用过吗?

至于结果为什么是16,可以去看一下上一篇笔记的分析。

下面我们使用#pragma pack指令来指定对齐的字节数。

(1)指定按1字节对齐

#pragma、#error指令你用过吗?

运行结果为:

#pragma、#error指令你用过吗?

(2)指定2字节对齐

#pragma、#error指令你用过吗?

运行结果为:

#pragma、#error指令你用过吗?

可见,指定的对齐的字节数不一样,得到的结果也不一样。指定对齐有什么用呢,大概就是可以避免了移植过程中编译器的差异带来的代码隐患吧。比如两个编译器的默认对齐方式不一样,那可能会带来一些bug。

2、#pragma message

该指令用于在预处理过程中输出一些有用的提示信息,如:

#pragma、#error指令你用过吗?

运行结果为:

#pragma、#error指令你用过吗?

如上,我们平时可以在一些条件编译块中加上类似信息,因为在一些宏选择较多的情况下,可能会导致代码理解起来会混乱。不过现在一些编译器、编辑器都会对这些情况进行一些很明显的区分了,比如哪块代码没有用到,那块代码的背景色就会是灰色的。

3、#pragma warning

该指令允许选择性地修改编译器警告信息。

例子:

#pragma warning( disable : 4507 34; once : 4385; error : 164 )

等价于:

#pragma warning(disable:4507 34) // 不显示4507和34号警告信息
#pragma warning(once:4385)       // 4385号警告信息仅报告一次
#pragma warning(error:164)       // 把164号警告信息作为一个错

这个指令暂且了解这么多,知道有这么一回事就可以。

关于#pragma指令还有很多用法,但比较冷门,这里暂且不列举,有兴趣的朋友可以自行学习。


以上就是本次的笔记分享,如有错误,欢迎指出。谢谢

展开阅读全文

页面更新:2024-06-20

标签:指令   可能会   编译器   冷门   示例   字节   平时   错误   阶段   两个   语言   代码   方式   笔记   科技   信息

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top