- 1、本文档共10页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
UNIX的基础编程环境讲解
C语言
预处理
2.1预处理操作符
.预处理操作符只用在宏定义的单词系列中,其中#是一元操作符,##是二元操作符, 例如:
#a ; a##b
# 以预处理操作符#号开头的宏参数,有它自己对应的转换为字符串字面量的非扩展实
参数.(字符变量或字符串变量成员中包含的每个双引号和反斜线都使用反斜线转义).
这个规则仅在类似函数的宏内部中使用.
## 如果一个替换单词系列包含##操作符,则删除##以及它前后的空格符,把相邻的单词连
接起来,建立一个新单词.这种情况仅在扩展宏时才发生,可用在任何宏定义.例如:
#define M1 3
#define M2 M1##2
M2 = M12
注:1.#只能用在宏函数的定义中,##可用在任何情况
2.#的操作数如是宏,则预编译时,该宏不展开
3.##首先把它两边的空格去掉,把##两边的字符连接起来,##的操作数如是宏,则预编译
时,该两个宏不展开
2.2预处理数
预处理数由一个数字构成,前面可以加一个可选的点号,后面可以跟着字母,下划线,数
字,点号以及一个e+,e-,E+或E-,例:
#define R 2e##3
2.3宏定义和扩展
格式:
#define MacroName token-sequence
#define MacroFunc(identifier-list) token-sequence
扩展:1.实参在调用中可以被扩展,然后,它们替换宏定义在替换单词系列中对应的参数.如
果宏实参在替换串里是#或##的操作数,那么在调用中不扩展它们,否则都实行扩展.
例如:
#define M1 3
FLM(a,b)定义 调用 结果 是否扩展
a+b FLM(2,3) 2+3
a+b FLM(M1,2) 3+2 是,是
#a FLM(M1,2) “M1” 否
a##b FLM(M1,2) M12 否,否
a+#a FLM(M1,2) 3+”M1” 是,否
2.4条件编译
#ifdef #ifndef #elif #else #endif
#ifdef后的条件表达式之一: defined(MacroName)
2.5行控制
#line constant “filename”
含义:使编译程序相信,为了出错诊断和排错的目的,下一个源码行的行号等于constant(它
必须是十进制)
2.6断言
格式: 定义 #assert predicate(token-sequence)
删除 #unassert predicate(token-sequence)
一个断言可以在#if语句中用下述语法测试:
#if # predicate(token-sequence)
假如定义了断言,则返回真.
系统为6386提供下列缺省谓词:
#assert machine(i386)
#assert system(unix)
#assert cpu(i386)
2.7版本控制
格式: #ident “version”
2.8出错信息生成
格式: #error token-sequence
含义:使编译系统产生一条包含token-sequence的诊断信息,然后停止
变量的定义
.C语言编写的程序是以函数为基础的,其中main也是一个函数(主函数),所以任何一个
变量,它只可能要么在函数内定义,要么在函数外定义.定义一个变量时应先确定该变量的
作用域,其次在确定该变量在内存中的生存期(对于变量的生存期与变量在内存中所分配
的空间有很大的联系)
.定义一个变量的三要素:1.何地定义(确定作用域);2.数据类型;3.数据的存储类别(确定
变量的生存周期)
1.从变量的作用域来看变量
.局部变量:在一个函数内部定义的变量,它只
文档评论(0)