一. 宏
c语言用#define 来声明一个宏,宏可以带参数,如:
#define PI 3.14 //定义一个宏PI表示3.14
#define CIRCLE_AREA ((x)*(x)*(PI)) //定义宏计算圆的面积
如果一行写不下,可以加入反斜杠’\'表示下一行也是宏的声明,下面代码等价:
#define NAME "xiaohaha"
#define NAME \
"xiaohaha"
定义的宏可以被#undef撤销
二.条件编译
每个#if
结构都以#endif
结束
#ifdef HONG
和#if defined(HONG)
等价
#ifndef
和#if !defined(HONG)
等价
注意前者没有括号,后者需要将宏用括号括起来
调试程序时,我们经常需要输出一些变量的值,可以用:
#ifdef DEBUG
printf("Variable x = %d\n",x);
#endif
只有前面定义过DEBUG
,该语句才会被编译执行
三.#和##运算符
# 可以将标记转换成用引号引起的字符串,如:
#define HELLO(x) printf("Hello,"#x"\n")
//HELLO(xiaohaha) equals printf("Hello,""xiaohaha""\n")
==##==将两个标记拼接在一起,如:
#define TOKENCONCAT(x,y) x##y
当程序中出现TOKENCONCAT(O,K)
时,将会被OK
替换
四.断言
断言assert()
测试一个表达式的值,如果表达式为假,则打印出错信息并调用abort
函数结束程序
需要#include<assert.h>
通过定义NDEBUG
可以忽略其后所有断言
#define NDEBUG
必须放在#include<assert.h>
之前
五.头文件
以下定义头文件的模板可以有效避免多次include同一个头文件:
#ifndef _COORDIN_H
#define _COORDIN_H
... // 头文件的内容
#endif