新闻中心

EEPW首页>嵌入式系统>设计应用> 写出高效优美的单片机C语言代码

写出高效优美的单片机C语言代码

作者: 时间:2013-07-01 来源:网络 收藏

14,判断字符是不是16进值的数字

#define HEXCHK( c ) ( ((c) >= '0' (c) = '9') ||

((c) >= 'A' (c) = 'F') ||

((c) >= 'a' (c) = 'f') )

15,防止溢出的一个方法

#define INC_SAT( val ) (val = ((val)+1 > (val)) ? (val)+1 : (val))

16,返回数组元素的个数

#define ARR_SIZE( a ) ( sizeof( (a) ) / sizeof( (a[0]) ) )

17,返回一个无符号数n尾的值MOD_BY_POWER_OF_TWO(X,n)=X%(2^n)

#define MOD_BY_POWER_OF_TWO( val, mod_by )

( (dword)(val) (dword)((mod_by)-1) )

18,对于IO空间映射在存储空间的结构,输入输出处理

#define inp(port) (*((volatile byte *) (port)))

#define inpw(port) (*((volatile word *) (port)))

#define inpdw(port) (*((volatile dword *)(port)))

#define outp(port, val) (*((volatile byte *) (port)) = ((byte) (val)))

#define outpw(port, val) (*((volatile word *) (port)) = ((word) (val)))

#define outpdw(port, val) (*((volatile dword *) (port)) = ((dword) (val)))

19,使用一些宏跟踪调试

A N S I标准说明了五个预定义的宏名。它们是:

_ L I N E _

_ F I L E _

_ D A T E _

_ T I M E _

_ S T D C _

如果编译不是标准的,则可能仅支持以上宏名中的几个,或根本不支持。记住编译程序也许还提供其它预定义的宏名。

_ L I N E _及_ F I L E _宏指令在有关# l i n e的部分中已讨论,这里讨论其余的宏名。

_ D AT E _宏指令含有形式为月/日/年的串,表示源文件被翻译到时的日期。

翻译到目标的时间作为串包含在_ T I M E _中。串形式为时:分:秒。

如果实现是标准的,则宏_ S T D C _含有十进制常量1。如果它含有任何其它数,则实现是非标准的。

可以定义宏,例如: 当定义了_DEBUG,输出数据信息和所在文件所在行

#ifdef _DEBUG

#define DEBUGMSG(msg,date) printf(msg);printf(“%d%d%d”,date,_LINE_,_FILE_)

#else

#define DEBUGMSG(msg,date)

#endif

20,宏定义防止使用时错误用小括号包含。

例如:#define ADD(a,b) (a+b)

用do{}while(0)语句包含多语句防止错误

例如:#difne DO(a,b) a+b;

a++;

应用时:if(….)

DO(a,b); //产生错误

else

解决方法: #difne DO(a,b) do{a+b;

a++;}while(0)

宏中"#"和"##"的用法

一、一般用法

我们使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起.

用法:

#include

#include

using namespace std;

#define STR(s) #s

#define CONS(a,b) int(a##e##b)

int main()

{

printf(STR(vck)); // 输出字符串"vck"

printf("%dn", CONS(2,3)); // 2e3 输出:2000

return 0;

}

二、当宏参数是另一个宏的时候

需要注意的是凡宏定义里有用'#'或'##'的地方宏参数是不会再展开.

1, 非'#'和'##'的情况

#define TOW (2)

#define MUL(a,b) (a*b)

printf("%d*%d=%dn", TOW, TOW, MUL(TOW,TOW));

这行的宏会被展开为:

printf("%d*%d=%dn", (2), (2), ((2)*(2)));

MUL里的参数TOW会被展开为(2).

2, 当有'#'或'##'的时候

#define A (2)

#define STR(s) #s

#define CONS(a,b) int(a##e##b)

printf("int max: %sn", STR(INT_MAX)); // INT_MAX #include

c语言相关文章:c语言教程




评论


相关推荐

技术专区

关闭