加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
  • 推荐器件
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

#error, #line, #pragma这几个宏定义你经常用吗?

02/18 15:40
5074
阅读需 8 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

#error 和 #warning

#error 是预编译器中的一个指示宏,用于生成一个编译错误的消息,也可以用于给自己做提示,比如有些宏的定义和值是否符合预期,可以通过#if等判断语句来输出编译错误信息提示自己。同样的#warning也一样可以起到提示作用,但#warning不会使编译器停止编译。用法:

#error    message#warning  message

#line

line 用于强制制定新的行号和编译文件名,并对源程序的代码重新进行编号

使用方法:

#line  number  newfilename

也可以:

line number  //只定义行号

line本质是重新定义 _LINE_ 和 _FILE_ 两个编译参数,在错误打印和调试方面非常有用。

举个例子:

#include <stdio.h>//作者 A 写的代码 //------------开始-------------------------- //把 line 的下一行定义为第 1 行,文件名为“a.c”#line 1 "a.c"//------------结束--------------------------

 

//作者 B 写的代码 //------------开始-------------------------- //把 line 的下一行定义为第 1 行,文件名为“b.c”#line 1 "b.c"//------------结束--------------------------

 

//作者 C 写的代码 //-----------------开始--------------------------#line 1 "MyCode.c"int main(){    printf("%s:%dn",__FILE__,__LINE__);//输出 MyCode.c:4#line 1 "Test.c"     printf("%s:%dn",__FILE__,__LINE__);//输出 Test.c:2    return 0;} //-----------------结束--------------------------

#pragma

pragma 用于指示编译器完成一些特定的动作。

pragma 所定义的很多命令字是编译器特有的,在不同的编译器间是不可移植的。

处理器将忽略它不认识的#pragma 指令不同编译器可能以不同的方式解释同一条#pragma 指令

一般用法:

#pragma parameter //注意,不同的 parameter 参数语法和意义不同
    message 参数在大多数的编译器中都有相似的实现message 参数在编译时输出消息到编译输出窗口中message 用于条件编译可提示代码的版本信息

与#error 和#warning 不同,#pragma message 仅仅代表一条编译消息,不代表程序错误。

#pragma once

pragma once 用于保证头文件只被编译一次

pragma once是编译器相关的,不一定被支持(vcgcc 都支持,bcc 不支持!)

#pragma once 比#ifndef…#define…#endif 效率高,因为后者定义的头文件仍然被处理。前者只要头文件被定义一次,就不会再次被处理。

#pragma once //说明:因#pragma once 不被所有的编译器支持(如 bcc 不支持),但              //#pragma once 又比#ifndef...#define...#endif 效率高,如果              //为了让支持#pragma once 的编译器有更高的效率有更高的效率,             //可以采用如下的头文件定义方式
#pragma once //当编译器不支持#pragma once 时,会直接忽略这行 #ifndef _HEADER_FILE_H_ #define _HEADER_FILE_H_//source code#endif

#pragma pack

用于指定内存对齐方式

#pragma pack(1)按一字节对齐,通常被使用在一些靠指针和结构体解析命令和数据的场合。

#include <stdio.h>#pragma pack(2)struct Test1{     char c1; //对齐参数:min(1,2)=1, offset = 0      short s; //对齐参数:min(2,2)=2, offset = 2    char c2; //对齐参数:min(1,2)=1, offset = 4    int i;   //对齐参数:min(4,2)=2, offset = 6}; #pragma pack()

 

#pragma pack(4)struct Test2{     char c1; //对齐参数:min(1,4)=1, offset = 0    char c2; //对齐参数:min(1,4)=1, offset = 1    short s; //对齐参数:min(2,4)=2, offset = 2    int i;   //对齐参数:min(4,4)=4, offset = 4}; #pragma pack()

 

int main(){    printf("sizeof(Test1) = %dn",sizeof(struct Test1)); //10    printf("sizeof(Test2) = %dn",sizeof(struct Test2)); //8    return 0;}

为什么要做字节对齐呢?

推荐器件

更多器件
器件型号 数量 器件厂商 器件描述 数据手册 ECAD模型 风险等级 参考价格 更多信息
BT169D,112 1 WeEn Semiconductor Co Ltd Silicon Controlled Rectifier, 0.8A I(T)RMS, 400V V(DRM), 400V V(RRM), 1 Element, TO-92, PLASTIC PACKAGE-3
$0.3 查看
0190020024 1 Molex Push-On Terminal, 2mm2, ROHS COMPLIANT
$0.83 查看
BTA26-600BWRG 1 STMicroelectronics 25A standard and Snubberless&#8482; Triacs

ECAD模型

下载ECAD模型
$5.71 查看

相关推荐

电子产业图谱

多年硬件从业经验,专注分享从研发到供应链,再到精益制造过程中的经验和感悟!