C语言常用宏定义技巧
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用语言编程,宏定义是个很重要地编程技巧.用好了宏定义,它可以增强程序地可读性、可移植性、方便性、灵活性等等.
. 防止一个头文件被重复包含:
头文件内容
当你所建地工程有多个源文件组成时,很可能会在多个文件里头包含了同一个头文件,如果借用上面地宏定义就能够避免同一个头文件被重复包含时进行多次编译.因为当它编译第一个头文件时总是没有定义
,那么它将编译一遍头文件中所有地内容,包括定义
.这样编译再往下进行时如果遇到同样要编译地头文件,那么由于语句
地存在它将不再重复地编译这个头文件.
. 通过宏定义使得同一数据类型地字节数不因不同地平台或不同地编译器而改变:
;
* *
;
* *
;
* *
;
* *
;
* *
;
* *
;
* *
. 得到指定地址地一个字节或字:
() (*(( *)()))
() (*(( *)()))
注:类似于这种有多个字符串组成地宏定义一定要注意加上“()”,因为我们知道宏定义只是一种简单地字符替换功能.
. 求最大值和最小值:
() ((()>())?():())
() ((()<())?():())
. 得到一个结构体中所占用地字节数:
() ((( *))>)
. 按照格式把两个字节转化为一个:
() (((()()[])*)()[])
或可以是
()(((()())*)())
.按照格式把一个转化为两个字节:
() { ()[](());
()[] (());}()
或可以是
() {
(()); (());}()
注:这里地{}()是为了防止多语句地宏定义在使用中出错.比如:
(…)
()
上面地程序代码中要是宏定义()中没有{}(),这时我们应该将语句改为:
(…)
{()}
{}
.得到一个变量地地址:
() (( *)( *)())
() (( *)( *)())
注:宏定义语句中 *申明了该地址可以是任何类型变量地地址,
*申明为单字节变量地地址, *申明为双字节变量地地址.
.得到一个高位和低位字节:
() (()(()()))
() (()(()()>>))
.返回一个比大地最接近地地倍数:
() (((()))*)
.将一个字母转换为大写:
() ( (() > ‘’ () < ‘’) ? (() – ) : () )
相对应地还有将一个字母转换为小写:
() ( (() > ‘’ () < ‘’) ? (() ) : () )
注:如果你记不住大写和小写之间地差值,可以将换成(’’‘’),但这里小写地值大于大写地值你该要记住地吧.
. 防止溢出地一个方法:
() ( (() > ()) ? () : ())还可以做成循环计数地(加入计数器是个无符号整数): () ( (() > ()) ? () : ())
. 宏中“”和“”地用法:
一般用法:使用“”把宏参数变为一个字符串,用””把两个宏参数结合在一起
例程:# ""
# ""
()
() ()
()
{
(()); 输出字符串“”
(“”()); 输出:
;
}
当宏参数是另一个宏地时候,注意宏定义里有用“”或“”地地方宏参数是不会再展开地:非“”和“”情况:
例程:
()
() (*)
(“*”());
该行可展开为(“*”,(),(),(()*()));
有“”或“”情况:
例程:
()
()
() ()
(“ : ”());
在
该行展开为(“ : ”,””);
即这里只是展开宏(),而下一级宏没有被展开
(“”());
这一行编译将会产生错误,因为它展开为(“”());为了解决其不能展开地问题,我们可以多加一层中间转换宏以实现所有宏地展开,如果你在编程时不确定你是否用到宏地嵌套问题,最好都加一级中间转换宏,以免产生错误.
例程:
()
()
() ()
() ()
() ()
(“ : ”());
将被展开,它是型地最大值,输出为: :
(“”());
两层宏都将能够展开,()à ((),
())à(()()),输出为:
顶一下回首页