C语言宏定义(error and pragma)

来源:互联网 发布:破解大陆封锁网络 编辑:程序博客网 时间:2024/06/05 05:58

#error token-sequence
其主要的作用是在编译的时候输出编译错误信息token-sequence,从方便程序员检查程序中出现的错误。 该指令用于程序的调试, 当编译中遇到#error指令就停止编译。

#define CONST_NAME1 "CONST_NAME1"
printf("%s/n",CONST_NAME1);
#undef CONST_NAME1
#ifndef CONST_NAME1
#error No defined Constant Symbol CONST_NAME1
#endif

宏定义#pragma     其格式一般为: #Pragma Para
其中Para 为参数,下面来看一些常用的参数。
(1)message 参数。它能够在编译信息输出窗口中输出相应的信息,这对于源代码信息的控制是非常重要的。其使用方法为:#Pragma message(“消息文本”)
example:#ifdef _X86
                #Pragma message(“_X86 macro activated!”)
               #endif
当我们定义了_X86这个宏以后,应用程序在编译时就会在编译输出窗口里显示“_X86 macro activated!”。我们就不会因为不记得自己定义的一些特定的宏而抓耳挠腮了。

2)通过#pragma pack(n)改变C编译器的字节对齐方式
     另外,还有如下的一种方式:
     · __attribute((aligned (n))),让所作用的结构成员对齐在n字节自然边界上。
如果结构中有成员的长度大于n,则按照最大成员的长度来对齐。
     · __attribute__ ((packed)),取消结构在编译过程中的优化对齐,按照实际
占用字节数进行对齐。
在网络协议编程中,经常会处理不同协议的数据报文。一种方法是通过指针偏移的
方法来得到各种信息,但这样做不仅编程复杂,而且一旦协议有变化,程序修改起来
也比较麻烦。在了解了编译器对结构空间的分配原则之后,我们完全可以利用这
一特性定义自己的协议结构,通过访问结构的成员来获取各种信息。这样做,
不仅简化了编程,而且即使协议发生变化,我们也只需修改协议结构的定义即可,
其它程序无需修改,省时省力。下面以TCP协议首部为例,说明如何定义协议结构。
其协议结构定义如下:
#pragma pack(1) // 按照1字节方式进行对齐
struct TCPHEADER
{
     short SrcPort; // 16位源端口号
     short DstPort; // 16位目的端口号
     int SerialNo; // 32位序列号
     int AckNo; // 32位确认号
     unsigned char HaderLen : 4; // 4位首部长度
     unsigned char Reserved1 : 4; // 保留6位中的4位
     unsigned char Reserved2 : 2; // 保留6位中的2位
     unsigned char URG : 1;
     unsigned char ACK : 1;
     unsigned char PSH : 1;
     unsigned char RST : 1;
     unsigned char SYN : 1;
     unsigned char FIN : 1;
     short WindowSize; // 16位窗口大小
     short TcpChkSum; // 16位TCP检验和
     short UrgentPointer; // 16位紧急指针
};
#pragma pack() // 取消1字节对齐方式