c语言中宏定义总结

1、#define EOF (-1)

如上,宏定义的时候要加括号!!

2、带参数的宏定义

例1:

#define SS(X)  X*X

int a=16,k=2,m=1;
a/=SS(k+m)/SS(k+m);//a的值为2

分析:

因为宏定义中X*X没有加括号,我们原样替换:

a/=2+1*2+1/2+1*2+1;---->7;

/= 优先级最低,最后算;

a= 16/7 ------>2

总结:宏定义可以替代函数的使用,不需要预编译。

例2:

# if __BYTE_ORDER == __BIG_ENDIAN
/* The host byte order is the same as network byte order,
   so these functions are all just identity.  */
# define ntohl(x) (x)
# define ntohs(x) (x)
# define htonl(x) (x)
# define htons(x) (x)
# else
#  if __BYTE_ORDER == __LITTLE_ENDIAN
#   define ntohl(x) __bswap_32 (x)
#   define ntohs(x) __bswap_16 (x)
#   define htonl(x) __bswap_32 (x)
#   define htons(x) __bswap_16 (x)
#  endif
# endif
typedef unsigned short int uint16;
 
typedef unsigned long int uint32;
 
 
 
// 短整型大小端互换
 
#define BigLittleSwap16(A)  ((((uint16)(A) & 0xff00) >> 8) | \
                            (((uint16)(A) & 0x00ff) << 8))
 
 // 长整型大小端互换
 
 
 
#define BigLittleSwap32(A)  ((((uint32)(A) & 0xff000000) >> 24) | \
                            (((uint32)(A) & 0x00ff0000) >> 8) | \
 
                            (((uint32)(A) & 0x0000ff00) << 8) | \
 
                            (((uint32)(A) & 0x000000ff) << 24))
 
 
 
 // 本机大端返回1,小端返回0
 
int checkCPUendian()
 
{
 
       union{
 
              unsigned long int i;
 
              unsigned char s[4];
 
       }c;
 
 
 
       c.i = 0x12345678;
 
       return (0x12 == c.s[0]);
 
}
 
 
 
// 模拟htonl函数,本机字节序转网络字节序
 
unsigned long int t_htonl(unsigned long int h)
 
{
 
       // 若本机为大端,与网络字节序同,直接返回
 
       // 若本机为小端,转换成大端再返回
 
       return checkCPUendian() ? h : BigLittleSwap32(h);
 
}
 
 
 
// 模拟ntohl函数,网络字节序转本机字节序
 
unsigned long int t_ntohl(unsigned long int n)
 
{
 
       // 若本机为大端,与网络字节序同,直接返回
 
       // 若本机为小端,网络数据转换成小端再返回
 
       return checkCPUendian() ? n : BigLittleSwap32(n);
 
}
 
 
 
// 模拟htons函数,本机字节序转网络字节序
 
unsigned short int t_htons(unsigned short int h)
 
{
 
       // 若本机为大端,与网络字节序同,直接返回
 
       // 若本机为小端,转换成大端再返回
 
       return checkCPUendian() ? h : BigLittleSwap16(h);
 
}
 
 
 
// 模拟ntohs函数,网络字节序转本机字节序
 
unsigned short int t_ntohs(unsigned short int n)
 
{
 
       // 若本机为大端,与网络字节序同,直接返回
 
       // 若本机为小端,网络数据转换成小端再返回
 
       return checkCPUendian() ? n : BigLittleSwap16(n);
 
}

 

4、宏定义字符串

#define   RUNLOGPATH  “/nand_flash/runlog.dat”

5、宏定义中使用别的宏

#define  LEFT 100
#define  RIGHT 200
#define  NUM   (RIGHT-LEFT+1)

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值