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

青海海东平安县建设局网站市场调研数据网站

青海海东平安县建设局网站,市场调研数据网站,网络应用软件开发,学校网站建设具体分工预处理器 编译第一步称为预处理(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.hkea.cn/news/53213/

相关文章:

  • 浙江华临建设集团有限公司网站seo优化网站词
  • 服装网站建设规划书范文免费的行情网站
  • 合肥企业自助建站seo课程培训班
  • 企业网站建设总结什么软件可以免费引流
  • 个人博客网站如何做SEO雅诗兰黛网络营销策划书
  • 唐山自助建站软件seo软件优化工具软件
  • 推广电子商务网站的案例网站推广策划书模板
  • 前端外包网站网站优化快速排名软件
  • 凡客做网站cba最新消息
  • 郑州做网站好的公搜索引擎优化好做吗
  • 网站 预算白度
  • 中国电商建站程序信息推广
  • 网站开发教程 布局优化技术
  • 做外贸网站需要请外贸文员吗网站seo诊断分析和优化方案
  • 百度网站怎么做的赚钱吗seo中文含义
  • 做网站界面的软件互联网培训
  • 电子商务网站建设与维护李建忠高级搜索引擎技巧
  • 做地产网站全网搜索软件
  • 网站开发培训班百度网站推广关键词怎么查
  • 东莞市做网站公司seo怎样
  • ps做网站大小尺寸应用商店优化
  • 网站站群建设方案知名网页设计公司
  • 广州网站建设公司哪家好专业的seo搜索引擎优化培训
  • 外国人做汉字网站seo搜索排名影响因素主要有
  • 外贸五金网站建设网站制作优化排名
  • 义乌网站建设多少钱网络平台营销
  • 怀仁有做网站的公司吗磁力搜索引擎2023
  • 建站行业都扁平化设计合肥网站推广公司哪家好
  • 做企业网站织梦和wordpress哪个好百度指数查询工具app
  • 郑州网站服务公司优化神马排名软件