Chinaunix首页 | 论坛 | 博客
  • 博客访问: 291595
  • 博文数量: 43
  • 博客积分: 628
  • 博客等级: 上士
  • 技术积分: 392
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-30 18:11
文章分类

全部博文(43)

文章存档

2014年(1)

2013年(8)

2012年(11)

2011年(23)

分类: C/C++

2011-10-24 15:12:39

一、C语言由源代码生成的各阶段如下:

C源程序->编译预处理->编译->优化程序->汇编程序->链接程序->可执行文件

       其中 编译预处理阶段,读取c源程序,对其中的伪指令(以#开头的指令)和特殊符号进行处理。或者说是扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。预处理过程先于编译器对源代码进行处理。

       在C 语言中,并没有任何内在的机制来完成如下一些功能:在编译时包含其他源文件、定义宏、根据条件决定编译时是否包含某些代码。要完成这些工作,就需要使用预处理程序。尽管在目前绝大多数编译器都包含了预处理程序,但通常认为它们是独立于编译器的。预处理过程读入源代码,检查包含预处理指令的语句和宏定义,并 对源代码进行响应的转换。预处理过程还会删除程序中的注释和多余的空白字符。

二、伪指令(或预处理指令)定义

      预处理指令是以#号开头的代码行。#号必须是该行除了任何空白字符外的第一个字符。#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。下面是部分预处理指令:
指令  用途
# 空指令,无任何效果
#include 包含一个源代码文件
#define 定义宏
#undef 取消已定义的宏
#if 如果给定条件为真,则编译下面代码
#ifdef 如果宏已经定义,则编译下面代码
#ifndef 如果宏没有定义,则编译下面代码
#elif 如果前面的#if给定条件不为真,当前条件为真,则编译下面代码,其实就是else if的简写
#endif 结束一个#if……#else条件编译块
#error 停止编译并显示错误信息

#ifdef … #else …#endif
TAG:预编译和宏定义,ANSI C,条件编译,#ifdef … #else …#endif
TEXT:
此编译指令类似于C语言中的if else 语句,是一种典型的条件编译指令。其语法形式如下:
#ifdef 常量表达式
代码段1
#else
代码段2
#endif
其中常量表达式可以仅仅为一个编译标志。
如果常量表达式的值为真(非零值),编译代码段1部分的代码,否则编译代码段2部分的代码。
当常量表达式为简单的编译标志时,如果此编译标志在前面的代码中,已经使用#define指令定义过,且在当前的代码段中有效,则编译代码段1部分的代码,否则编译代码段2部分的代码。
例11-7 定义符号常量CONST_TRUE 和TAG_TRUE,根据不同的条件进行不同操作。
#define CONST_TRUE 1
#define TAG_TRUE
void main()
{
#ifdef CONST_TRUE
printf("The CONST_TRUE is true\n");
#else
printf("The CONST_TRUE is false\n");
#endif
#ifdef TAG_TRUE
printf("The TAG_TRUE is defined\n");
#else
printf("The TAG_TRUE is not defined\n");
#endif
}
程序的运行结果如下
The CONST_TRUE is true
The TAG_TRUE is defined
因为CONST_TRUE代表1,所以系统编译printf("The CONST_TRUE is true\n")部分代码,因此程序运行输出“The CONST_TRUE is true”的结果。如果CONST_TRUE代表0,则系统编译printf("The CONST_TRUE is false\n")部分代码。由于TAG_TRUE已经定义,所系统编译printf("The TAG_TRUE is defined\n")部分代码。
此编译指令的简单形式为单分支的条件编译指令,其语法格式如下:
#ifdef常量表达式
代码段
#endif
如果常量表达式的值为真,则编译“代码段”部分的代码,否则跳过此部分的代码。当常量表达式为编译标志时,如果此编译标志有效,则编译“代码段”部分的代码,否则跳过此部分的代码。
下面程序中,只有定义了TAG_TRUE 之后,才可以编译printf("The TAG_TRUE is defined\n")语句。
#ifdef TAG_TRUE
printf("The TAG_TRUE is defined\n");
#endif

REF:.txt
#if defined… #else …#endif
TAG:预编译和宏定义,ANSI C,条件编译,#if defined… #else …#endif
TEXT:
此编译指令为#ifdef … #else …#endif的等价编译指令。其语法格式如下:
#if defined 常量表达式
代码段1
#else
代码段2
#endif
#if defined (常量表达式)
代码段1
#else
代码段2
#endif
此编译指令的简单形式为单分支的条件编译指令,其语法形式如下:
#if defined常量表达式
代码段1
#endif


REF:.txt
#ifndef … #else …#endif
TAG:预编译和宏定义,ANSI C,条件编译,#ifndef … #else …#endif
TEXT:
语法形式如下:
#ifndef 常量表达式
代码段1
#else
代码段2
#endif
如果常量表达式的值为假(零值)时,编译代码段部分的代码,否则编译代码段2部分的代码。当常量表达式为编译标志时,如果此编译标志无效则编译代码段1部分的代码,否则编译代码段2部分的代码。
此编译指令的简单形式为单分支的选择编译指令,其语法格式如下:
#ifndef常量表达式
代码段1
#endif


REF:.txt
#if !defined … #else …#endif
TAG:预编译和宏定义,ANSI C,条件编译,#if !defined … #else …#endif
TEXT:
此编译指令与#ifndef … #else …#endif等价,其语法形式如下:
# if !defined 常量表达式
代码段1
#else
代码段2
#endif
# if !defined(常量表达式)
代码段1
#else
代码段2
#endif
提示 头文件的重复包含,造成变量重复定义或函数的重复声明,此错误是初学者经常遇到的一个问题。主要的原因是在编辑自己的头文件的时候,并没有加入有效的预防措施。解决此类问题,在文件开始与结尾加入类似代码
#if !defined(MY__INCLUDED_) /*此头文件对应的编译标志*/
#define MY__INCLUDED /*此头文件没有被包含,所以编译此部分的代码*/
……
#endif // !defined(MY__INCLUDED)

REF:.txt
#ifdef …#elif … #elif …#else … #endif
TAG:预编译和宏定义,ANSI C,条件编译,#ifdef … #else …#endif
TEXT:
此编译指令类似于C语言中的if else 语句,是一种典型的条件编译指令。其语法形式如下:
#ifdef 常量表达式
代码段1
#else
代码段2
#endif
其中常量表达式可以仅仅为一个编译标志。
如果常量表达式的值为真(非零值),编译代码段1部分的代码,否则编译代码段2部分的代码。
当常量表达式为简单的编译标志时,如果此编译标志在前面的代码中,已经使用#define指令定义过,且在当前的代码段中有效,则编译代码段1部分的代码,否则编译代码段2部分的代码。
例11-7 定义符号常量CONST_TRUE 和TAG_TRUE,根据不同的条件进行不同操作。
#define CONST_TRUE 1
#define TAG_TRUE
void main()
{
#ifdef CONST_TRUE
printf("The CONST_TRUE is true\n");
#else
printf("The CONST_TRUE is false\n");
#endif
#ifdef TAG_TRUE
printf("The TAG_TRUE is defined\n");
#else
printf("The TAG_TRUE is not defined\n");
#endif
}
程序的运行结果如下
The CONST_TRUE is true
The TAG_TRUE is defined
因为CONST_TRUE代表1,所以系统编译printf("The CONST_TRUE is true\n")部分代码,因此程序运行输出“The CONST_TRUE is true”的结果。如果CONST_TRUE代表0,则系统编译printf("The CONST_TRUE is false\n")部分代码。由于TAG_TRUE已经定义,所系统编译printf("The TAG_TRUE is defined\n")部分代码。
此编译指令的简单形式为单分支的条件编译指令,其语法格式如下:
#ifdef常量表达式
代码段
#endif
如果常量表达式的值为真,则编译“代码段”部分的代码,否则跳过此部分的代码。当常量表达式为编译标志时,如果此编译标志有效,则编译“代码段”部分的代码,否则跳过此部分的代码。
下面程序中,只有定义了TAG_TRUE 之后,才可以编译printf("The TAG_TRUE is defined\n")语句。
#ifdef TAG_TRUE
printf("The TAG_TRUE is defined\n");
#endif

阅读(4174) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~