#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:2return 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 = 0short s; //对齐参数:min(2,2)=2, offset = 2char c2; //对齐参数:min(1,2)=1, offset = 4int i; //对齐参数:min(4,2)=2, offset = 6};#pragma pack()
#pragma pack(4)struct Test2{char c1; //对齐参数:min(1,4)=1, offset = 0char c2; //对齐参数:min(1,4)=1, offset = 1short s; //对齐参数:min(2,4)=2, offset = 2int i; //对齐参数:min(4,4)=4, offset = 4};#pragma pack()
int main(){printf("sizeof(Test1) = %dn",sizeof(struct Test1)); //10printf("sizeof(Test2) = %dn",sizeof(struct Test2)); //8return 0;}
为什么要做字节对齐呢?
2038
下载ECAD模型