会展中心网站平台建设方案,在登录某些网站时输入完账号密码后网页跳转后竟然又回到了登陆界面,比较好的h5制作软件,做好对外门户网站建设专栏#xff1a;C语言 个人主页#xff1a;HaiFan. 专栏简介#xff1a;本专栏主要更新一些C语言的基础知识#xff0c;也会实现一些小游戏和通讯录#xff0c;学时管理系统之类的#xff0c;有兴趣的朋友可以关注一下。 #define预处理预定义符号define#define定义标识符… 专栏C语言 个人主页HaiFan. 专栏简介本专栏主要更新一些C语言的基础知识也会实现一些小游戏和通讯录学时管理系统之类的有兴趣的朋友可以关注一下。 #define预处理预定义符号define#define定义标识符#define定义宏#define替换规则带副作用的宏参数宏的缺点命名约定预处理
预定义符号
__FILE__ //进行编译的源文件
__LINE__ //文件当前的行号
__DATE__ //文件被编译的日期
__TIME__ //文件被编译的时间
__STDC__ //如果编译器遵循ANSI C其值为1否则未定义define
#define定义标识符
语法#define name stuff举个例子
#include stdio.h
#define MAX 1000
int main()
{printf(%d,MAX);return 0;
}注在define定义标识符的时候不要在最后加上 ; 比如#define MAX 1000 这样容易导致一些问题。
#define定义宏 #define机制包括了一个规定允许把参数替换到文本中这种实现通常称为宏macro或定义宏define macro。 下面是宏的声明方式
#define name( parament-list ) stuff
//其中的 parament-list 是一个由逗号隔开的符号表它们可能出现在stuff中注意 参数列表的左括号必须与name紧邻。 如果两者之间有任何空白存在参数列表就会被解释为stuff的一部分。 比如#define MUL(x) x*x
这个宏接收一个参数x然后进行x*x的运算。 宏也有值得注意的地方。
#include stdio.h#define MUL(x) x*x*xint main()
{printf(%d, MUL(5 1));return 0;
}这个代码的结果是216吗 为什么会是16 因为宏是替换。它只是把x替换成了51但是在替换的时候并没有对(51)进行计算。实际上算的是printf(%d, 51*51*51);那么如何解决这个问题呢只需要在宏定义上加上括号即可。
#include stdio.h#define MUL(x) (x)*(x)*(x)int main()
{printf(%d, MUL(5 1));return 0;
}这样就能达到预期的效果了。
#define替换规则
在程序中扩展#define定义符号和宏时需要涉及几个步骤。
在调用宏时首先对参数进行检查看看是否包含任何由#define定义的符号。如果是它们首先 被替换。替换文本随后被插入到程序中原来文本的位置。对于宏参数名被他们的值所替换。最后再次对结果文件进行扫描看看它是否包含任何由#define定义的符号。如果是就重复上 述处理过程。
注意
宏参数和#define 定义中可以出现其他#define定义的符号。但是对于宏不能出现递归。当预处理器搜索#define定义的符号的时候字符串常量的内容并不被搜索。
带副作用的宏参数
当宏参数在宏的定义中出现超过一次的时候如果参数带有副作用那么你在使用这个宏的时候就可能出现危险导致不可预测的后果。副作用就是表达式求值的时候出现的永久性效果。
x1无副作用
x有副作用#include stdio.h
#define MAX(x, y) (x) (y)? (x) : (y) int main()
{int a 1;int b 2;int ret MAX(a, b);printf(a%d,b%d,ret%d, a, b, ret);return 0;
}这个代码的结果会是什么呢 这里我们得知道预处理器处理之后的结果是什么
ret ( (x) (y) ? (x) : (y));宏是替换直接把x和y替换成了a和b所以会造成上面的问题。
宏的缺点
每次使用宏的时候一份宏定义的代码将插入到程序中。除非宏比较短否则可能大幅度增加程序 的长度。宏是没法调试的。宏由于类型无关也就不够严谨。宏可能会带来运算符优先级的问题导致程容易出现错。
命名约定
宏在命名的时候要把宏名全大写 函数在命名的时候遵循驼峰原则