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

阳朔县建设规划局网站查排名的网站

阳朔县建设规划局网站,查排名的网站,wordpress金融,北京室内设计师电话预处理器 编译第一步称为预处理(preprocessing)阶段。C预处理器(preprocessor)在源代码编译之前对其进行一些文本性质的操作,包括删除注释、插入被#include 指令包含的文件的内容,替换由#define指令定义的符号以及根据条件编译指令进行编译。 预定义符…

预处理器

编译第一步称为预处理(preprocessing)阶段。C预处理器(preprocessor)在源代码编译之前对其进行一些文本性质的操作,包括删除注释、插入被#include 指令包含的文件的内容,替换由#define指令定义的符号以及根据条件编译指令进行编译。

预定义符号

#define
#define name stuff

预处理器把所有name替换成 stuff。

在程序中扩展#define定义符号和宏时,需要涉及几个步骤:

1.在调用宏时,首先对参数进行检查,看看是否包含了任何由#define 定义的符号。如果是,

它们首先被替换。

2.替换文本随后被插入到程序中原来文本的位置。对于宏,参数名被它们的值所替代。

3.最后,再次对结果文本进行扫描,看看它是否包含了任何由#define 定义的符号。如果是,就重复上述处理过程。这样,宏参数和#define 定义可以包含其他#define定义的符号。但是,宏不可以出现递归。

更多例子

#define reg register
#define do_forever for(;;) 
#define CASE break;case

如果定义中的stuff非常长,它可以分成几行,除了最后一行之外,每行的末尾都要加一个反斜杠。

#define DEBUG_PRINT printf(“File 8s line 8d:”\ "x=8d, y=8d,z=8d",_FILE__,__LINE__,\X, y, z)

但是尽量使用内联函数,不要使用宏定义函数

#define允许把参数替换到文本中,这种实现通常称为宏(macro)或定义宏(defined macro)。

宏的声明方式:

#define name(parameter-list) stuff

避免使用宏定义函数

#define SQUARE(x)  x* x
问题:
a = 5;
SQUARE(a+1)=>  a+1*a+1 
修正:
#define SQUARE(x) (x)*(x)#define DOUBLE(x) (x)+(x)
问题:
a=5;
10*DOUBLE(a);=>10*(5)+(5)
修正:
#define DOUBLE(x) ((x)+(x))
宏与函数

宏非常频繁地用于执行简单的计算,比如在两个表达式中寻找其中较大(或较小)的一个:

#define MAX( a, b )   ((a)>(b)?(a):(b))

函数的参数必须声明为一种特定的类型,所以它只能在类型合适的表达式上使用。反之,这个宏可以用于整型、长整型、单浮点型、双浮点数以及其他任何可以用>操作符比较值大小的类型。宏是与类型无关的。

根本无法用函数实现的任务:

#define MALLOC(n, type)
((type *)malloc((n)*sizeof( type)))pi = MALLOC( 25, int );
pi =(( int * )malloc((25)* sizeof( int )));

类型无法作为参数传到函数中。(在类型萃取中也会用到(bool_type))

带副作用的宏参数

当宏参数在宏定义中出现的次数超过一次时,如果这个参数具有副作用,那么当你使用这个宏

时就可能出现危险,导致不可预料的结果。

#define MAX( a,b) ((a)>(b)?(a):(b)) 
x=5; y=8;
Z=MAX( x++, Y++ );=> Z=((x++)>(y++ )?(x++):( y++ ));
printf(“x=8d, y=8d, z=8d\n”,x,Y.z);

#undef

用于移除一个宏定义,如果一个现存的名字需要被重新定义,那么旧定义首先必须用#undef移除。

#undef name
命令行定义

可以在命令行中进行宏定义

int array[ARRAY_SIZE]; 
gcc...  -D ARRAY_SIZE=100 prog.c//大概是这样
条件编译

使用条件编译,可以选择代码的一部分是被正常编译还是完全忽略

(如只用于调试程序的语句)。

用于支持条件编译的基本结构是#if指令和与其匹配的#endif指令。

#if constant-expressionstatements
#endif
//example:
#define DEBUG 1
#if DEBUGprintf("x=8d, y=8d\n",x,y );
#endif//is-else
#if constant-expression
statements
#elif constant-expression
other statements
#else
other statements
#endif//测试符号是否被定义
#ifdef symbol
#ifndef symbol//指令嵌套
#if #ifdef OPTION1unix_version_of_option1();
#endif #ifdef OPTION2unix_version_of_option2();
#endifdefined(OS_MSDOS)#elif #ifdef OPTION2msdos_version_of_option2();
#endif
#endif
文件包含 (#include)

#include指令使另一个文件的内容被编译,预处理器删除#include,并用包含文件的内容取而代之。

使用#include 文件涉及一些开销但不大。

(1)如果两个源文件都需要同一组声明,把这些声明复制到每个源文件中所花费的编译时间跟把这些声明放入一个头文件,然后再用#include 指令把它包含于每个源文件所花费的编译时间相差无几。

(2)开销只是在程序被编译时才存在,对运行时效率无影响。

把这些声明放于一个头文件中,如果其他源文件还需要这些声明,就不必把这些拷贝逐一复制到这些源文件中,维护简单。

模块化的设计:

把使用几个头文件,每个头文件包含用于某个特定函数或模块的声明的做法更好一些。

函数库文件包含
#include <filename>

由编译器定义的"一系列标准位置"查找函数库头文件,如UNIX系统上的C编译器在/user/include目录查找函数库头文件。编译器允许把其他目录添加到这个列表,这样就可以创建自已的头文件函数库。

本地文件包含

处理本地头文件的一种常见策略就是在源文件所在的当前目录进行查找,如果该头文件并未找到,编译器就像查找函数库头文件一样在标准位置查找本地头文件。

#include "filename"
嵌套文件包含

头文件中包含头文件

// functions.h
#ifndef FUNCTIONS_H
#define FUNCTIONS_H
#include <stdio.h>  // 包含以获取EOF等定义
int read_valid_int(void);  // 函数声明
#endif /* FUNCTIONS_H */

嵌套文件包含可能会将头文件包含多次,出现重复编译的问题。可以使用条件编译。所有的头文件都像下面这样编写:

#ifndef _HEADERNAME_H
#define _HEADERNAME_H 1
/*
** All the stuff that you want in the header file
*/
#endif

那么,多重包含的危险就被消除了。当头文件第 1 次被包含时,它被正常处理,符号_HEADERNAME_H 被定义为1。如果头文件被再次包含,通过条件编译,它的所有内容被忽略。

其他指令

#error 指令允许你生成错误信息

#error 指令允许你生成错误信息
#error text of error message
#line number "string

#line number通知预处理器 number是下一行输入的行号。

如果给出了可选部分“string”,预处理器就把它作为当前文件的名字。值得注意的是,这条指令将修改__LINE__符号的值,如果加上可选部分,它还将修改__FILE_符号的值,这条指令常用于把其他语言的代码转换为C代码的程序。

#pragma 向编译器发送特定的命令或请求,这些命令通常是编译器特定的,用来控制编译过程中的某些方面

#pragma once:这是非标准但广泛使用的指令,用于防止头文件被多次包含。

#pragma warning(disable: warning-number):关闭特定警告编号的编译器警告。

#pragma optimize("level"):指定优化级别。

#pragma message("message"):生成一个编译器信息消息。

#pragma source_encoding("encoding"):指定源文件的字符编码。

包规范:在某些编译器中,可以用来指定或控制某些编译特性。

调试辅助:#pragma pack(push, n) 和 #pragma pack(pop):用于控制结构体成员的对齐方式。

http://www.15wanjia.com/news/9640.html

相关文章:

  • 网站建设外包协议2345网址导航设为主页
  • 网站怎么做流量互换怎样做产品推广
  • 电商网站建设seo下载站
  • 图片展示网站织梦源码成都网络营销公司排名
  • 一个电信ip做网站卡不卡在哪里推广比较好
  • 成都网络营销网站简述提升关键词排名的方法
  • 怎么做和京东一样网站免费发广告的平台有哪些
  • wordpress如何生成单页的网站地图网推放单平台
  • php开发网站优势网络媒体推广方案
  • 网络网站推广优化品牌软文范文
  • 网站页面设计模板代码今日十大热点新闻头条
  • 什么网站做招聘收录好谷歌google
  • 成品网站安装必应搜索引擎地址
  • 建立门户网站万能软文模板
  • 建站公司最喜欢的网站网站整站优化
  • 档案信息网站建设的意义关键词批量调词 软件
  • 查看网站是什么语言做的大庆网络推广
  • 公司网站模板seo和sem的联系
  • 东莞做网站怎么样网店运营培训
  • 企业网站管理系统标签手册免费推广网站注册入口
  • 网站防劫持怎么做网上电商怎么做
  • 百度网站推广网络seo是什么意思知乎
  • 建站技术论坛免费发外链的网站
  • 织梦 做网站 教程深圳营销型网站设计公司
  • 广西智能网站建设平台网站建立具体步骤是
  • 男女做暧网站搜索引擎优化的主要特征
  • 如何做超市的网站北京seo外包平台
  • 东莞做网站需要避免这些因素百度新闻网站
  • 网站建设收费标准公司宁波优化推广找哪家
  • 设计制作生态瓶教学设计日喀则网站seo