当前位置: 首页 > news >正文

大朗镇仿做网站15年做那些网站致富

大朗镇仿做网站,15年做那些网站致富,河北省建设厅办事大厅网站,wordpress 翻页失效引言 对预处理的相关知识进行详细的介绍 ✨ 猪巴戒#xff1a;个人主页✨ 所属专栏#xff1a;《C语言进阶》 #x1f388;跟着猪巴戒#xff0c;一起学习C语言#x1f388; 目录 引言 预定义符号 #define定义常量 #define定义宏 带有副作用的宏参数 宏替换的规则 …引言 对预处理的相关知识进行详细的介绍 ✨ 猪巴戒个人主页✨                所属专栏《C语言进阶》         跟着猪巴戒一起学习C语言 目录 引言 预定义符号 #define定义常量 #define定义宏 带有副作用的宏参数 宏替换的规则 宏函数的对比 #和##  #运算符 ##运算符 命名约定 #undef 条件编译 头文件的包含 嵌套文件的包含 预处理又叫预编译预处理是编译过程中的第一个步骤主要是处理以#开头的预编译指令。 预定义符号 C语言设置了一些预定义符号可以直接使用预定义符号也是在预处理期间处理的。 __FILE__ //进行编译的源文件的文件名 __LINE__ //文件当前的行号 __DATE__ //文件被编译的日期 __TIME__ //文件被编译的时间 __STDC__ //如果编译器崔寻ANSI C其值为1否则就是未定义。 #define _CRT_SECURE_NO_WARNINGS #include stdio.h int main() {printf(%s\n, __FILE__);printf(%d\n, __LINE__);printf(%s\n, __TIME__);printf(%s\n, __DATE__);return 0; } #define定义常量 #define name stuff 在预编译的过程中会用stuff来代替name。 比如下面的MAX就是要被替换的name在预处理的阶段MAX会被替换成100。 #define MAX 100 int main() {printf(%d\n, MAX);return 0; } 后面的stuff不仅可以是数字也可以是一个长句。 #define PRINT printf(hello world\n) int main() {PRINT;return 0; } #define定义宏 #define定义宏不仅可以完成语句的替换还可以将参数传进去。 #define name(parament_list) stuff parament_list表示的就是参数有了参数的加入stuff的表达更加丰富。 注意参数列表的左括号必须与name紧邻如果两者之间有任何空白存在参数列表就会被解释为stuff的一部分 比如说 #define SQUARE(x) xx int main() {int a 10;printf(%d\n, SQUARE(a));return 0; } 这里的SQUARE(x)中的 x 就是参数将参数a代替x然后带入后面的表达式。 这里的SQUARE(a),经过替换就是 aa.  但是这种定义宏的写法是存在瑕疵的#define定义宏的书写一定要在各个参数上加上括号在整体的表达式加上括号。 下面的书写方式才是正确的。 #define SQUARE(x) ((x)(x)) 接下来看两个错误的示范 1. #define SQUARE(x) x*x int main() {int a 10;printf(%d\n, SQUARE(a1));return 0; } 这里的本来预想的结果是11*11121但是预处理并不是首先将参数进行计算而是简单地将参数进行替换SQUARE(a1)会被替换成a1*a1(101*1010),所以最后地结果是21。 解决办法就是 #define SQUARE(x) (x)*(x) 2. #define SQUARE(x) xx int main() {int a 10;printf(%d\n, 10*SQUARE(a));return 0; } 这里本来预想的结果是200但是将参数进行替换,10*SQUARE(a)-10*aa,结果就是110. 解决办法就是 #define SQUARE(x) (xx) 总结 为了避免宏定义中参数中操作符或临近操作符之间不可预料的相互作用。我们应该毫不吝啬地在参数和参数表达式整体加上括号。 带有副作用的宏参数 刚刚讲了定义宏是什么接下来是带有副作用的宏参数。如果参数带有副作用那么你在使用这个宏的时候就可能出现危险导致不可预测的后果。副作用就是表达式求值的时候出现的永久性效果。 x1; //不带副作用 x; //带有副作用 多次使用宏定义那就会导致x的值发生变化最终导致的结果就会大相径庭。 #define MAX(a,b) ((a)(b)?(a):(b)) int main() {int x 4;int y 5;int z MAX(x, y);printf(%d %d %d\n, x, y, z);return 0; } 这里xy作为参数,MAX(x,y)会被替换成((x)(y)?(x):(y))首先x和y比较大小x的值会变成5y的值会变成6那么后面的y表达式就会被执行因为是前置先执行后所以结果是6但是y的值变成了7。 宏替换的规则 在程序中扩展#define定义符号和宏时需要涉及几个步骤。 在调用宏时首先对参数进行检查看看是否包含任何由#define定义的符号。如果时它们首先被替换。替换文本随后被插入到程序中原来文本的位置。对于宏参数名被它们的值所替换。最后再次对结果文件进行扫描看看它是否包含任何由#define定义的符号。如果时就重复上述处理过程。 注意 宏参数和#define定义中可以出现其他#define定义的符号。但是对于宏不能出现递归。 当预处理器搜索#define定义的符号的时候字符串常量的内容并不被搜索。 宏函数的对比 属性#define定义宏函数代码长度每次使用时宏代码都会被插入到程序中。除了非常小的宏之外程序的长度会大幅度增长函数代码只出现与一个地方每次执行函数调用的都是同一个地方执行速度更快存在函数的调用和返回函数栈帧的时间速度会慢一些操作符优先级宏参数的求值是在所有周围表达式的上下文环境里除非加上括号否则邻近操作符的优先级可能会产生不可预料的后果所以建议宏在书写的时候多些括号。函数参数只在函数调用的时候直接将参数的值传递给函数。带有副作用的参数参数可能被代替到宏体中的多个位置如果宏的参数被多次计算带有副作用的参数求值可能会产生不可预料的结果函数参数只在传参的时候对参数进行求值参数类型宏的参数与类型无关只要对参数的操作是合法的它就可以使用与任何参数类型函数的参数是与类型有关的不同的参数类型就要不同的函数所以比较严格调试宏是不方便调试的函数是可以逐语句调试递归宏是不能递归的 函数是可以递归的 #和##  #运算符 #运算符将宏的一个参数转换为字符串字面量它仅允许出现在带参数的宏的替换列表中。 #运算符所所执行的操作可以理解为“字符串化”。 #define PRINT(n) printf(the value of #nis %d,n) 之所以通过#运算符进行字符串化是因为在字符串中#define是不会进行替换的。 printf(the value of ais %d,a); ##运算符 ##运算符可以把位于它两边的符号合成一个符号它允许宏定义从分离的文本片段创立标识符。##被称为记号粘连。 int int_max(int x, int y) {return x y ? x : y; }float float_max(float x, float y) {return x y ? x : y; } 由于类型的不同这个比较大小的功能必须分为两个函数进行实现。 下面是一个定义宏通过下面的定义宏将类型作为参数替换函数中的类型。 其中\是换行符type_max如果直接书写就是函数名称了分开书写然后用##来粘合就可以实现替换函数名。 #define GENERIC_MAX(type)\ type type##_max(type x,type y)\ {\return (xy?x:y);\ }GENERIC_MAX(int) GENERIC_MAX(float)//等同于上面两个函数的代码 命名约定 一般来说函数和宏语法很相似所以语言本身没法帮助我们区分二者。 那我们平时的一个习惯是 把宏名全部大写函数名不全部大写 #undef 我们直到#define name就是定义一个常量#undef就是取消宏定义。 #define MAX 100 #undef MAX //这里往后MAX就取消宏定义不能直接使用MAX了 条件编译 条件编译指令有 #ifdef #if #endif #elif #else #ifndef #if 表达式 语句 后面加表达式和if的意思一样但是这个步骤是在预处理的时候完成的如果表达式为假就不会出现在后面的文件中。 #elif 表达式 语句和else if的意思一样和#if搭配使用。 #else 语句和else的意思一样。 #endif 不同的是我们在使用完条件编译指令后要加上#endif表示预处理完成。 #ifdef  :  意思如果后面被定义就执行后面的语句。 #ifndef : 意思如果后面没被定义就执行后面的语句。 int main() {#ifdef MAXprintf(haha\n);#endifreturn 0; } #if 常量表达式//... #endif //常量表达式由预处理器求值。 如#define __DEBUG__ 1 #if __DEBUG__//.. #endif2.多个分⽀的条件编译 #if 常量表达式//... #elif 常量表达式//... #else//... #endif3.判断是否被定义 #if defined(symbol) #ifdef symbol#if !defined(symbol) #ifndef symbol4.嵌套指令 #if defined(OS_UNIX)#ifdef OPTION1unix_version_option1();#endif#ifdef OPTION2unix_version_option2();#endif #elif defined(OS_MSDOS)#ifdef OPTION2msdos_version_option2();#endif #endif 头文件的包含 #incldue filename 库函数通过包含会在指定的标准头文件位置查找头文件。 #include filename 通过”“包含会先在源文件所在目录下查找如果头文件未找到编译器就会像查找库函数文件的方式一样去标准的头文件位置查找。 所以库函数也可以用”“来包含但是这样查找的效率就慢也不容易区分库文件和本地头文件。 嵌套文件的包含 #include指令会将头文件进行包含在预处理阶段实现但是如果是多个源文件的交互合作那么程序会对同一个头文件多次包含那么就会在大大增加程序包含的代码量。 所以我们通过条件编译解决头文件多次引用问题 ifndef __TEST_H__ #define __TEST_H__ //头⽂件的内容 #endif //或者 #pragma once 当头文件被第一次引用时就会定义__TEST_H__,那么在第二次打开的时候__TEST_H__就已经被定义因为#ifndef,头文件就不会再次包含。
http://www.zqtcl.cn/news/289371/

相关文章:

  • 小规模开普票网站建设几个点张浦专业做网站
  • 点击图片跳转到网站怎么做链接网址后缀名大全
  • php网站开发优化crm客户系统
  • 韩国网站免费模板wordpress数据库名称
  • 如何修改网站发布时间贵阳网站建设报价
  • 东莞网站推广培训免费云电脑
  • 湖北网站建设详细方案脑叶公司手机版下载
  • 淄博网站制作平台形象怎样建设旅游网站
  • 广州花都网站建设网站改版协议
  • 中国建设协会网站首页工信部网站备案被删除
  • 丹阳网站建设案例dedecms 购物网站
  • 网站上怎么做动画广告视频下载seo黑帽是什么意思
  • 服装网站建设网综合社区网站开发费用
  • 做网站预付款 怎么做账做律师网站的网络公司
  • 购物网站开发模板小程序注册拉新
  • 怎么建立一个网站能够与讯飞云对话罗湖附近公司做网站建设哪家好
  • 唐山网站制作公司北京网站开发优选ls20227
  • php 网站备份代码广州网站设计公司招聘
  • 做ppt的网站兼职上海未来网站建设公司
  • 某某公司网站建设论文wordpress 企业 主题
  • 网站提示域名解析错误怎么办百度网址提交
  • 福建省住房城乡建设部网站车公庙网站建设
  • 长沙网站seo诊断ip138禁止查询该域名
  • 大学生网站设计作业动画ftp发布asp.net网站
  • 网站建设哪家企业好站内优化怎么做
  • 萌宝宝投票网站怎么做网上商城推广方法
  • 网站建设规划书样板社交电商
  • 网站怎么做直播功能吗水库信息化网站建设
  • c语言做网站账号登录系统外资公司代理注册
  • 建站公司塔山双喜做饲料推广哪个网站好