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 OPTION1
		unix_version_option1();
	#endif
	#ifdef OPTION2
		unix_version_option2();
	#endif
#elif defined(OS_MSDOS)
	#ifdef OPTION2
	msdos_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.mfbz.cn/a/889164.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

太速科技-607-基于FMC的12收和12发的光纤子卡

基于FMC的12收和12发的光纤子卡 一、板卡概述 本卡是一个FPGA夹层卡&#xff08;FMC&#xff09;模块&#xff0c;可提供高达2个CXP模块接口&#xff0c;提供12路收&#xff0c;12路发的光纤通道。每个通道支持10Gbps,通过Aurora协议&#xff0c;可以组成X4&#xff0…

中间件介绍

可以把中间件想象成是在应用和系统之间搭建的一座桥梁&#xff0c;或者说是一个“翻译官”和“中转站”。它处在操作系统、网络和数据库之上&#xff0c;应用软件的下层&#xff0c;负责实现应用软件之间的互联互通&#xff0c;使得应用软件能够更方便、高效地进行数据交换和通…

2024最新CSDN Markdown编辑器语法教程

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

R语言中的plumber介绍

R语言中的plumber介绍 基本用法常用 API 方法1. GET 方法2. POST 方法3. 带路径参数的 GET 方法 使用 R 对数据进行操作处理 JSON 输入和输出运行 API 的其他选项其他功能 plumber 是个强大的 R 包&#xff0c;用于将 R 代码转换为 Web API&#xff0c;通过使用 plumber&#x…

cmake --build使用踩坑记录

根据 深入理解 CMake 的 cmake --build 命令_cmake build-CSDN博客等消息来源的说法&#xff0c; cmake --build <dir> 将在目录<dir>中产生结果文件。但是实测发现&#xff0c;这里有坑&#xff1a;如果目录<dir>中没有CMakeCache.txt等文件的话&#xff…

高性能缓存方案 —— Caffeine

一、简介 Caffeine是一个高性能的Java缓存库&#xff0c;它提供了本地缓存的功能。 Caffeine和Redis都是内存级别的缓存&#xff0c;为什么要使用在这两缓存作为二级缓存&#xff0c;它们两有什么区别呢? 虽然它们都是内存级别的缓存&#xff0c;但是Redis是需要单独部署的&…

RPA技术的定义与原理

RPA&#xff08;Robotic Process Automation&#xff09;即机器人流程自动化&#xff0c;是一种利用软件机器人或机器人工具来自动执行重复性、规则性和可预测性的业务流程的技术。以下是对RPA技术的详细介绍&#xff1a; 一、RPA技术的定义与原理 RPA技术通过模拟人工操作&a…

ORA-01031: insufficient privileges一次特殊的权限不足故障

在一个19C的数据库下,有多个PDB,我们使用公共用户c##xxx连接到不同的pdb的时候,发现其中一个pdb无法truncate表,其它pdb都是正常的,手工在pdb内赋予此公共用户dba和sysdba权限都不行: 最后发现是这个用户的default role默认角色的问题,简单介绍一下default role: 当给用户赋予…

【Redis入门到精通十】Redis哨兵

目录 哨兵&#xff08;Sentinel&#xff09; 1.哨兵的由来 2.哨兵的基本概念 3.基于docker安装配置Redis哨兵 4.哨兵选取主节点的原理 1.主观下线 2.客观下线 3.选举出哨兵的leader 4.leader挑选出合适的slave成为新的master 哨兵&#xff08;Sentinel&#xff09; Red…

掌握RocketMQ4.X消息中间件(一)-RocketMQ基本概念与系统架构

1 MQ介绍 MQ(Message Quene) : 翻译为 消息队列,别名为 消息中间件&#xff0c;通过典型的 生产者和消费者模型,生产者不断向消息队列中生产消息&#xff0c;消费者不断的从队列中获取消息。因为消息的生产和消费都是异步的&#xff0c;而且只关心消息的发送和接收&#xff0c…

C语言 | Leetcode C语言题解之第454题四数相加II

题目&#xff1a; 题解&#xff1a; struct hashTable {int key;int val;UT_hash_handle hh; };int fourSumCount(int* A, int ASize, int* B, int BSize, int* C, int CSize, int* D, int DSize) {struct hashTable* hashtable NULL;for (int i 0; i < ASize; i) {for (…

Windows环境安装CentOS7

【注意】安装CentOS需要先安装Vmware虚拟机 【下载前准备】 一、下载CentOS 7镜像文件阿里云镜像开源&#xff0c;点击跳转 二、安装VMware&#xff08;17&#xff09;&#xff1a; a. 官网&#xff0c;点击跳转 b. 许可证&#xff1a;JU090-6039P-08409-8J0QH-2YR7F 安装V…

美国1米DEM地形瓦片数据免费分享(4)-新泽西州

一、简要介绍 新泽西州(英语:State of New Jersey)位于美国中大西洋地区&#xff0c;其命名源自位于英吉利海峡中的泽西岛&#xff0c;昵称为“花园州”。新泽西州亦为美国东部的一个州&#xff0c;北接纽约州&#xff0c;东面大西洋&#xff0c;南向特拉华州&#xff0c;西临…

图片批量转格式png转jpg,这几种转换方法看一遍就学会

在日常工作和学习中&#xff0c;我们经常需要处理各种图片格式&#xff0c;尤其是PNG和JPG这两种最为常见。PNG格式因其无损压缩和透明度支持而备受欢迎&#xff0c;但在某些场合下&#xff0c;JPG格式因其更高的压缩率和更广泛的兼容性更为适用。今天&#xff0c;就为大家介绍…

A CXL-Powered Database System: Opportunities and Challenges——论文阅读

ICDE 2024 Paper CXL论文阅读笔记整理 背景 Compute Express Link&#xff08;CXL&#xff09;是处理器和设备&#xff08;如内存缓冲区&#xff09;之间的开放式行业标准互连协议&#xff0c;基于CXL的内存架构如图1所示&#xff0c;拥有高带宽、低延迟以及对一致性和内存语…

深入理解 CSS 浮动(Float):详尽指南

“批判他人总是想的太简单 剖析自己总是想的太困难” 文章目录 前言文章有误敬请斧正 不胜感恩&#xff01;目录1. 什么是 CSS 浮动&#xff1f;2. CSS 浮动的历史背景3. 基本用法float 属性值浮动元素的行为 4. 浮动对文档流的影响5. 清除浮动clear 属性清除浮动的技巧1. 使用…

SpringBoot 多元化配置(正则表达式,配置文件优先级)

1.配置绑定 所谓“配置绑定”就是把配置文件中的值与 JavaBean 中对应的属性进行绑定。通常&#xff0c;我们会把一些配置信息&#xff08;例如&#xff0c;数据库配置&#xff09;放在配置文件中&#xff0c;然后通过 Java 代码去读取该配置文件&#xff0c;并且把配置文件中…

linux点灯驱动实验实现

1.用字符串实现LED灯驱动编写 LED灯连接到的是GPIO1_IO03口上&#xff0c;所以我们只需要初始化这个引脚时钟&#xff0c;配置这个引脚和电器属性&#xff0c;我们就可以通过寄存器对LED进行控制。 2.内存映射 与STM32等芯片不同的是&#xff0c;linux系统对引脚地址操作不是…

Android SELinux——基础介绍(一)

Android 系统的安全策略是保护用户的隐私和数据不受侵害的重要保证&#xff0c;一个相对安全的计算环境对于确保移动设备的安全至关重要。随着新的威胁不断出现&#xff0c;Android 的安全策略也在不断发展和完善&#xff0c;以应对新的挑战。 一、概念介绍 1、SELinux SELin…

5款人声分离免费软件分享,从入门到精通,伴奏提取分分钟拿捏!

人声分离通常是音乐制作、混音和卡拉OK中常用的重要技术之一。它的核心是将乐器伴奏从原始音轨中分离出来&#xff0c;使得用户可以单独处理或重混音频&#xff0c;创造出清晰干净的伴奏轨道。若缺乏强大的音频剪辑软件或专业人声分离工具&#xff0c;这一过程往往会比较困难。…