预处理指令

1. 人们常常称机器语言为目标代码(Object code)

2. 预处理命令(Preprocessor directives)三种预处理包括:宏定义、文件包含、条件编译。在对源程序编译之前,会对程序中的所有预处理指令进行处理。预处理就是在进行编译的第一遍词法扫描和语法分析之前所作的工作。说白了,就是对源文件进行编译前,先对预处理部分进行处理,然后对处理后的代码进行编译。

  • 宏定义: #define 标示符 常数/表达式/格式串等     注意:宏定义不是语句,所以不在末尾加分号; 预处理程序仅按照宏定义简单替换宏名,不作任何检查,如有错误只能在编译过程中发现; 宏定义在函数的外边,作用域到本文件结束,通常宏定义命令放在文件开头处
  • 文件包含:指一个源文件可以将另一个源文件的全部内容包含进来。 #include "包含文件名" 或 #include<包含文件名>    两种格式区别:1. 双引号,系统首先到当前目录查找,若找不到,再到系统指定的要包含文件目录(由系统在配置环境时设置)中去查找。2. 尖括号,直接到系统指定目录去查找。 常用在文件头部被包含文件简称头文件,常以“h”(head)作为后缀。在头文件中,可以包含宏定义外,还可以包含外部变量定义、结构类型定义等。一条包含命令,只能指定一个被包含文件,如果要包含多个,需要用多条包含命令。
  • 条件编译: 条件编译可以有效地提高程序的可移植性。

一般格式

    • #if 常量表达式

程序段1

#else

程序段2

#endif

当表达式为非零(“逻辑真”)时,编译程序段1,否则编译程序段2

  • #ifdef 标识符 程序段1  #else 程序段2  #endif     --> 当标识符已被#define命令定义过,则编译程序段1,否则编译程序段2
  • #ifndef 标示符 程序段1  --> 如果宏没有定义,则编译程序段1
  • #elif 是"else if"的意思,当前一层判断为false时,有条件的选择编译
  • #error message:编译器遇到此命令时停止编译,并将参数message输出。该命令常用于程序调试。

 

例子: 注意宏定义时的副作用

flawedexample: #define mymult ( a,b ) a*b
Source: k = mymult (i-1, j+5);
Postpreprocessing: k = i – 1 * j + 5;
better:  #define mymult ( a,b ) (a)*(b)
Source: k = mymult (i-1, j+5);

Postpreprocessing: k = (i – 1)*(j + 5);

=============================================

Macro: #define mysq (a)(a)*(a)
flawedusage:
Source: k = mysq ( i ++)
Postpreprocessing: k = ( i ++)*( i ++)
Alternativeis to use inline’ed functions
inline int mysq ( int a) {return a*a};

mysq(i++)works as expected in this case.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值