博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C/C++学习笔记——C提高:预处理
阅读量:4219 次
发布时间:2019-05-26

本文共 1770 字,大约阅读时间需要 5 分钟。

预处理的基本概念

C语言对源程序处理的四个步骤:预处理、编译、汇编、链接。

预处理是在程序源代码被编译之前,由预处理器(Preprocessor)对程序源代码进行的处理。这个过程并不对程序的源代码语法进行解析,但它会把源代码分割或处理成为特定的符号为下一步的编译做准备工作。

文件包含指令(#include)

文件包含处理

“文件包含处理”是指一个源文件可以将另外一个文件的全部内容包含进来。C语言提供了#include命令用来实现“文件包含”的操作。

#incude<>和#include""区别

  • “” 表示系统先在file1.c所在的当前目录找file1.h,如果找不到,再按系统指定的目录检索。
  • < > 表示系统直接按系统指定的目录检索。
    注意:
    1. #include <>常用于包含库函数的头文件;
    2. #include ""常用于包含自定义的头文件;
    3. 理论上#include可以包含任意格式的文件(.c .h等) ,但一般用于头文件的包含;

宏定义

无参数的宏定义(宏常量)

如果在程序中大量使用到了100这个值,那么为了方便管理,我们可以将其定义为:

const int num = 100; 但是如果我们使用num定义一个数组,在不支持c99标准的编译器上是不支持的,因为num不是一个编译器常量,如果想得到了一个编译器常量,那么可以使用:
#define num 100
在编译预处理时,将程序中在该语句以后出现的所有的num都用100代替。这种方法使用户能以一个简单的名字代替一个长的字符串,在预编译时将宏名替换成字符串的过程称为“宏展开”。宏定义,只在宏定义的文件中起作用。

#define PI 3.1415void test(){
double r = 10.0; double s = PI * r * r; printf("s = %lf\n", s);}

说明:

  1. 宏名一般用大写,以便于与变量区别;
  2. 宏定义可以是常数、表达式等;
  3. 宏定义不作语法检查,只有在编译被宏展开后的源程序才会报错;
  4. 宏定义不是C语言,不在行末加分号;
  5. 宏名有效范围为从定义到本源文件结束;
  6. 可以用#undef命令终止宏定义的作用域;
  7. 在宏定义中,可以引用已定义的宏名;

带参数的宏定义(宏函数)

在项目中,经常把一些短小而又频繁使用的函数写成宏函数,这是由于宏函数没有普通函数参数压栈、跳转、返回等的开销,可以调高程序的效率。

宏通过使用参数,可以创建外形和作用都与函数类似地类函数宏(function-like macro). 宏的参数也用圆括号括起来。

#define SUM(x,y) ((x)+(y))void test(){
//仅仅只是做文本替换 下例替换为 int ret = ((10)+(20)); //不进行计算 int ret = SUM(10, 20); printf("ret:%d\n",ret);}

注意:

  1. 宏的名字中不能有空格,但是在替换的字符串中可以有空格。ANSI C允许在参数列表中使用空格;
  2. 用括号括住每一个参数,并括住宏的整体定义。
  3. 用大写字母表示宏的函数名。
  4. 如果打算宏代替函数来加快程序运行速度。假如在程序中只使用一次宏对程序的运行时间没有太大提高。

条件编译

基本概念

一般情况下,源程序中所有的行都参加编译。但有时希望对部分源程序行只在满足一定条件时才编译,即对这部分源程序行指定编译条件。

在这里插入图片描述

条件编译

  • 防止头文件被重复包含引用;
#ifndef _SOMEFILE_H#define _SOMEFILE_H//需要声明的变量、函数//宏定义//结构体#endif

一些特殊的预定宏

C编译器,提供了几个特殊形式的预定义宏,在实际编程中可以直接使用,很方便。

//	__FILE__			宏所在文件的源文件名 //	__LINE__			宏所在行的行号//	__DATE__			代码编译的日期//	__TIME__			代码编译的时间void test(){
printf("%s\n", __FILE__); printf("%d\n", __LINE__); printf("%s\n", __DATE__); printf("%s\n", __TIME__);}

转载地址:http://pzxmi.baihongyu.com/

你可能感兴趣的文章
【自考】数据结构
查看>>
委托和Lambda表达式
查看>>
EF的基本了解(一)
查看>>
sql语句插入一条记录同时获取刚插入的id
查看>>
Mini Story 总结
查看>>
苹果手机页面不兼容问题——mui
查看>>
口语大神养成记—第一季
查看>>
Java基础
查看>>
编译原理
查看>>
流水线技术
查看>>
软考-计算机网络
查看>>
半年总结
查看>>
wcf服务发布到windows Server2008服务器上
查看>>
软考总结
查看>>
Json序列化与反序列化
查看>>
了解RESTFul接口
查看>>
WCF服务 远程服务器返回错误: (415)
查看>>
Talk sb to death
查看>>
C# 调用RESTFul接口
查看>>
C# 委托
查看>>