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

C语言预处理详解(下)(31)

文章目录

  • 前言
  • 一、命令行定义
  • 二、条件编译
  • 三、文件包含
    • 头文件被包含的方式
    • 嵌套文件包含
  • 总结


前言

  再介绍几点吧!


一、命令行定义

  许多C 的编译器提供了一种能力,允许在命令行中定义符号。用于启动编译过程

当我们根据同一个源文件要编译出不同的一个程序的不同版本的时候,这个特性便起到了作用。(假定某个程序中声明了一个某长度的数组,但是一个机器的内存有限,我们需要一个很小的数组,但是另外一个机器的内存很大,我们需要一个较大的数组)

以下代码就是一个具体的例子:
在这里插入图片描述

二、条件编译

  条件编译,即满足条件就参与编译,不满足条件就不参与编译
  未满足条件编译指令的代码,在预处理阶段将被编译器自动删除,不参与后面的代码编译过程

常见的条件翻译指令有以下几种:

  1. 单分支的条件编译
//如果#if后面的表达式为真,则“待定代码”的内容将参与编译
//否则“待定代码”的内容不参与编译
#if 表达式//待定代码
#endif
  1. 多分支的条件编译
//多分支的条件编译类似于if-else语句
//“待定代码1,2,3,4”之中只会有一段代码参与编译
#if 表达式//待定代码1
#elif 表达式//待定代码2
#elif 表达式//待定代码3
#else 表达式//待定代码4
#endif
  1. 判断是否被定义
//如果“表达式”被#define定义过,则“第一种的正面”的“待定代码”将参与编译,否则不参与编译。
//“第一种的反面”的执行机制与“第一种的正面”恰好相反//第一种的正面
#if defined(表达式)//待定代码
#endif//第一种的反面
#if !defined(表达式)//待定代码
#endif
  1. 嵌套指令
#if defined(OS_UNIX)#ifdef OPTION1unix_version_option1();#endif#ifdef OPTION2unix_version_option2();#endif
#elif defined(OS_MSDOS)#ifdef OPTION2msdos_version_option2();#endif
#endif

三、文件包含

头文件被包含的方式

假如你包含了以下头文件:

#include "filename"

此时查找策略:先在源文件所在目录下查找,如果该头文件未找到,编译器就像查找库函数头文件一样在标准位置查找头文件。如果找不到就提示编译错误

假如你包含了以下头文件:

#include <filename>

此时查找策略:查找头文件直接去标准路径下去查找,如果找不到就提示编译错误

所以说,对于库函数也可以使用 “ ” 的包含方式,只不过效率不高

嵌套文件包含

在这里插入图片描述
最终test.c程序中就会出现两份comm.h的内容。这样就造成了文件内容的重复

解决办法有两种:

  1. 使用条件编译,如果定义过,则无法再进行编译
#ifndef __TEST_H__
#define __TEST_H__
//头文件的内容
#endif  
  1. 加上该语句:
#pragma once 

总结

  终于结束了,马上就要迎来最后一篇收尾
  事先预告,虽然是最后一篇,但是并不是那么简单!


http://www.mrgr.cn/news/47058.html

相关文章:

  • Ubuntu/centOS 如何安装 OpenGL
  • G1原理—8.如何优化G1中的YGC
  • HTTP/HTTPS ⑤-CA证书 || 中间人攻击 || SSL/TLS
  • 什么是Qt
  • day09_kafka高级
  • 计算机视觉算法实战——实时车辆检测和分类(主页有相关源码)
  • gray_range_rect是这样的
  • 四氟采水器耐强酸PTFE打水桶可应用水资源研究及环境监测
  • 浏览器对象属性
  • 什么是DHCP Snooping?到底工作在第几层?
  • <<迷雾>> 第10章 用机器做一连串的加法(5)--控制器 示例电路
  • 【银河麒麟高级服务器操作系统】安全配置基线相关分析全过程及解决方案
  • Python 如何使用 Redis 作为缓存
  • 如何提高浮点类型计算的精度
  • SQL练习代码(第一篇)
  • 软件测试工作中-商城类项目所遇bug点
  • 【QT上位机/嵌入式项目】基于IMX6ull--Bluez蓝牙健康助手上位机
  • JavaScript判断array中是否存在某几个元素、字符串中是否存在某几个字符串
  • 打不死的超强生命力
  • 【一文讲透(番外篇)】如何编译安装KWDB v2.0.4数据库
  • 宝塔面板www目录,从系统盘切换到数据盘——浪浪云
  • Golang通用代码生成器:仙童,电音仙女尝鲜版十二,为售前准备的哑数据模式
  • python 实现寻找无向图的关节点Articulation Points算法
  • 【赵渝强老师】K8s中的有状态控制器StatefulSet
  • qt QGraphicsTextItem详解
  • PHP智慧餐饮新风尚点餐系统