n*n=i+4*i+4=1+4+4=9,不能达到预期效果
所以 最好把每个形参也用圆括号括起来。如:#define square(n)((n)*(n)) 则经宏扩展后变为:((i+4)*(i+4))
取消已有的宏定义:#undef,在undef后出现的宏将不再被扩展
二、文件包含:一个源文件可将另一个源文件的所有内容包含进来
一般形式:#include“文件名”(从当前目录中寻找文件,找不到再去一系列系统预先设定的目录中寻找,可普遍使用)
或 #include<文件名>(不在当前目录中寻找,径直到一系列系统预先设定的目录中寻找)
ps:1、头文件之所以成为头文件,是因为#include命令常出现在源文件头部
2、C本身包含很多头文件
stdio.h(输入输出函数)
string.h(字符串)
math.h(数学函数)
3、一个#include只能指定一个被包含的文件
4、#include可以嵌套,不可递归
三、条件编译:有时希望程序中的一部分只有在满足一定条件时才进行编译,否则不参与编译
一般形式:
1、如果常量表达式为真,非零,则相应程序段被编译,否则跳过它
#if 常量表达式
程序段
#endif
常量表达式是在编译时求值的,因此他只能由事先定义的宏名和常量组成,不能出现变量
2、如果常量表达式为真,非零,则程序段1被编译,否则编译程序段2
#if 常量表达式
程序段1
#else
程序段2
3、#if 常量表达式1
程序段1
#elif 常量表达式2
程序段2
∶
#elif 常量表达式n
程序段n
#else
程序段n+1
#endif
4、如果已经定义了相应的“宏名”,则编译程序段,否则跳过
#ifdef 宏名
程序段
#endif
5、如果已经定义了相应的“宏名”,则编译程序段1,否则编译程序段2
#ifdef 宏名
程序段1
#else
程序段2
#endif
6、如果没有定义相应的“宏名”,则编译程序段,否则跳过
#ifudef 宏名
程序段
#endif
7、如果没有定义相应的“宏名”,则编译程序段1,否则编译程序段2
#ifudef 宏名
程序段1
#else
程序段2
#endif