【C语言终章】预处理详解(下)

news2024/11/26 16:56:48

  【C语言终章】预处理详解(下)

  当你看到了这里时,首先要恭喜你!因为这里就是C语言的最后一站了,你的编程大能旅途也将从此站开始,为坚持不懈的你鼓个掌吧!

🥕个人主页:开敲🍉

🔥所属专栏:C语言🍓

🌼文章目录🌼

8. 命名约定

9. #undef

10. 命令行定义

11. 条件编译

12. 头文件的包含

    12.1头文件被包含的方式

        12.1.1 本地文件包含

        12.1.2 库文件包含

    12.2 嵌套文件包含

13. 其他预处理指令

8. 命名约定

  一般来讲宏和函数的使用语法很相似。所以语言本身没法很好的让我们区分二者,那我们可以从命名的角度来区分二者,我们平时的一个习惯是:

1  把宏命名全部大写

2  函数名不要全部大写

9. #undef

  如果我们想要重新定义一个已经定义存在的宏,需要用到这条指令先移除已经存在的宏,例如:

移除后的宏在重新定义以前无法使用。

10. 命令行定义

  许多C的编译器提供了一种能力,允许在编译启动时再定义符号,以便在启动编译后根据实际需要设置符号。

  例如:当我们根据同一个源文件要编译出一个程序的不同版本的时候,我们就需要用到这种能力(比如假设某个程序中声明了一个某长度的数组,如果这台机器的内存有限,那么这个数组的长度我们就不能太长;但是当我们把这个源文件放到一个内存够大的机器中时,我们又需要这个数组长一些。这个时候就需要我们在编译时根据这台机器实际需要来自己拟定数组的大小

  在Linux系统中我们有如下代码与指令:

#include <stdio.h>
int main()
{
int array [ARRAY_SIZE];
int i = 0;
for(i = 0; i< ARRAY_SIZE; i ++)
{
array[i] = i;
}
for(i = 0; i< ARRAY_SIZE; i ++)
{
printf("%d " ,array[i]);
}
printf("\n" );
return 0;
}

1  gcc  -D  ARRAY_SIZE = 10  programe.c

11. 条件编译

  在编译一个程序的时候我们如果要将一条语句(一组语句)编译或放弃就要用到条件编译指令。

  比如说:调试性的代码,保留碍事,删除又可惜(后续可能还会用到),因此我们可以对其进行选择性编译:

常见的条件编译指令:

1   1.
2       #if 常量表达式
3       //...
4       #endif
5       //常量表达式由预处理器求值。
6    如:
7       #define __DEBUG__ 1
8       #if __DEBUG__
9       //..
10     #endif


11   2.多个分⽀的条件编译
12       #if 常量表达式
13       //...
14       #elif 常量表达式
15       //...
16       #else
17       //...
18       #endif


19   3.判断是否被定义
20       #if defined(symbol)
21       #ifdef symbol
22       #if !defined(symbol)
23       #ifndef symbol


24   4.嵌套指令
25       #if defined(OS_UNIX)
26            #ifdef OPTION1
27                 unix_version_option1();

28            #endif
29            #ifdef OPTION2
30                  unix_version_option2();
31            #endif
32       #elif defined(OS_MSDOS)
33            #ifdef OPTION2
34                 msdos_version_option2();
35            #endif
36       #endif

 

  

12. 头文件的包含
    12.1头文件被包含的方式
        12.1.1 本地文件包含

  1  #include "filename";

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

  Linux环境标准头文件路径:

1  /usr/include

VS环境的标准头文件的路径:

1  C:\Program Files (x86)\Microsoft Visual Studio 12.0\VS\include

2  //这是VS2013的默认位置

注意按照自己的安装路径去找。

        12.1.2 库文件包含

1  #include <filename>  

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

  这样是不是可以说,对于库文件的包含也可以使用"filename"的形式?

  答案是可以的,但是效率方面会低一些。因为如果是用"filename"的形式包含,编译器首先去源文件所在目录下查找,找不到后才去库中查找,这样显然去目录查找是多余的。

    12.2 嵌套文件包含

  我们已经知道,#include指令可以使另外一个文件被编译。就像这个文件真的存在于这条指令中一样。实际上它是替换的。

  替换的方式也很简单:预处理器首先删除这条指令,并用该指令包含的文件中的内容全部拷贝替换到这条指令的位置。

  那么既然会拷贝数据,如果我们将一个头文件重复包含个几十次,就会导致程序的长度大幅增加。

  为了保证头文件不会被重复包含,我们又可以用到上面的条件编译

#define __TEST_H__  //包含__TEST_H__

#ifndef __TEST_H__    //如果没有包含TEST__H__,则执行下面的包含头文件操作

#include <filename>

#endif

  或者

1  #pragma once

13. 其他预处理指令

1  #error

2  #pragma

3  #line

4 .......     //这里不再做介绍,详细可以自行去了解

......       

#pragma pack()   //在前面结构体部分有介绍

    详细可以参考《C语言深度剖析》深入学习。

                                              

                                               创作不易,点个赞呗,蟹蟹啦~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1558745.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年蓝桥杯省赛——蜗牛

目录 题目链接&#xff1a;1.蜗牛 - 蓝桥云课 (lanqiao.cn) 思路 暴力贪心 代码实不了现 动态规划 代码实现 难点解释 总结 题目链接&#xff1a;1.蜗牛 - 蓝桥云课 (lanqiao.cn) 思路 暴力贪心 蓝桥杯反正是能暴力出来一个用例是一个&#xff0c;我真的被折磨了好久&…

10.python的字典dict(上)

10.python的字典dict(上) 什么是字典 在计算机科学中&#xff0c;字典是一种数据结构&#xff0c;用于存储键值对&#xff08;key-value pair&#xff09;的集合。每个键值对都由一个唯一的键和一个对应的值组成。字典能够快速地根据键找到对应的值&#xff0c;因此在很多编程…

探索----------------阿里云

目录 一、阿里云四大件 1、云服务器ECS 2、云数据库RDS 3、负载均衡SLB 4、对象存储OSS 5、其他的云计算产品 1&#xff09;内容分发网络CDN 2&#xff09;专有网络 VPC 二、linux发行版本 三、你平时对系统会怎么优化&#xff08;五大负载&#xff09; 1、cpu 使用率…

有什么好用的网页在线客服系统?选择指南与实用推荐

有什么好用的网页在线客服系统&#xff1f; 企业与客户之间的互动变得越来越重要。为了提高客户满意度和提升企业形象&#xff0c;许多企业开始使用网页在线客服系统。网页在线客服系统是一种实时的、便捷的沟通工具&#xff0c;可以帮助企业与客户建立更紧密的联系。 一、网…

黑马点评项目笔记 II

基于Stream的消息队列 stream是一种数据类型&#xff0c;可以实现一个功能非常完善的消息队列 key&#xff1a;队列名称 nomkstream&#xff1a;如果队列不存在是否自动创建&#xff0c;默认创建 maxlen/minid&#xff1a;设置消息队列的最大消息数量 *|ID 唯一id&#xff1a;…

C++刷题篇——07检测热点字符

一、题目 二、解题思路 1、使用map&#xff0c;key为元素&#xff0c;value为出现的次数 2、由于sort不适用于map&#xff0c;因此要将map的key、value放到vector中&#xff0c;再对vector排序 3、对map排序&#xff1a;方法1&#xff1a;使用二维数组vector<vector<>…

蓝桥杯习题

https://www.lanqiao.cn/problems/1265/learning/ 第一题---排序 给定一个长度为N的数组A&#xff0c;请你先从小到大输出它的每个元素&#xff0c;再从大到小输出他的每个元素。 输入描述&#xff1a; 第一行包含一个整数N 第二行包含N个整数a1,a2,a3,...an&#xff0c;表…

解决多模块项目报错,找不到程序包

本周&#xff0c;我遇到了一个常见的错误——“找不到程序包”。这个错误是由于模块间的依赖关系没有正确配置导致的。经过一系列的尝试和排查&#xff0c;我最终找到了解决问题的方法。下面&#xff0c;我将详细记录这次问题的处理过程&#xff0c;并总结其中的经验教训。 问…

C/C++ 之 GSL 数学运算库使用笔记

Part.I Introduction 本文主要记录一下笔者使用 GSL 过程当中所做的一些笔记。 Chap.I 传送门 一些传送门 GSL源码&#xff08;CMakeList 版本-Windows&#xff09;GSL源码&#xff08;configure 版本-Linux&#xff09;GSL 在线文档GSL 文档下载 Chap.II GSL 简介 GSL 全…

使用通用内部函数对代码进行矢量化

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV 如何使用 XML 和 YAML 文件的文件输入和输出 下一篇&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; ​ 目标 本教程的目标是提供使用通用内…

网络基础(二)——序列化与反序列化

目录 1、应用层 2、再谈“协议” 3、网络版计算器 Socket.hpp TcpServer.hpp ServerCal.hpp ServerCal.cc Protocol.hpp ClientCal.cc Log.hpp Makefile 1、应用层 我们程序员写的一个个解决我们实际问题&#xff0c;满足我们日常需求的网络程序&#xff0c;都是在…

书生·浦语2.0(InternLM2)大模型实战--Day01 趣味 Demo | 部署InternLM2-Chat-1.8B模型

课程介绍 了解完书生浦语InternLM2大模型实战–基本认知 后&#xff0c;就可以做 Homework-demo 啦 Day01的作业基本是按照GitHub链接完成 GitHub – 轻松玩转书生浦语大模型趣味 Demo 作业截图如下 基本作业是实战第一部分 进阶作业的后两个是实战的的第三、四部分 我把进阶…

【STM32 HAL库SPI/QSPI协议学习,基于外部Flash读取】

1、SPI协议 简介 SPI 协议是由摩托罗拉公司提出的通讯协议 (Serial Peripheral Interface)&#xff0c;即串行外围设备接口&#xff0c;是一种高速全双工的通信总线。它被广泛地使用在 ADC、LCD 等设备与 MCU 间&#xff0c;要求通讯速率较高的场合。 通信方式&#xff1a;同…

编程语言|C语言——C语言操作符的详细解释

这篇文章主要详细介绍了C语言的操作符&#xff0c;文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值&#xff0c;需要的朋友们下面随着小编来一起学习学习吧 一、基础 1.1 算数操作符 - * / % - * / 这些操作符是我们…

Head First Design Patterns -代理模式

什么是代理模式 代理模式为另一个对象提供替身或者占位符&#xff0c;以便控制客户对对象的访问&#xff0c;管理访问的方式有很多种。例如远程代理、虚拟代理、保护代理等。 远程代理&#xff1a;管理客户和远程对象之间的交互。 虚拟代理&#xff1a;控制访问实例化开销大的对…

Unity类银河恶魔城学习记录11-10 p112 Items drop源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili ItemObject_Trigger.cs using System.Collections; using System.Collecti…

金融衍生品市场

金融衍生品市场 衍生金融品的作用衍生金融工具远期合约期货合约期权 衍生金融品的作用 套期保值&#xff08;Hedging&#xff09; 组合多头头寸(long position)与空头头寸(short position)例&#xff1a;股票与股指期货 投机 衍生金融工具 远期合约 定义&#xff1a;在将来…

Java基础入门--面向对象课后题(1)

某公司正进行招聘工作&#xff0c;被招聘人员需要填写个人信息&#xff0c;编写“个人简历”的封装类Resume&#xff0c;并编写测试类进行实现。类图及输出效果如下。 类名&#xff1a;Resumename : String (private)sex : String (private)age : int (private)Resume( ) // 没…

记录实现水平垂直居中的5种方法

记录块级元素实现水平垂直居中的方法&#xff0c;效果如图。 <div class"parent"><div class"child">居中元素</div> </div><style> .parent {position: relative;width: 600px;height: 300px;background-color: #679389; …

【安全用电管理系统的应用如何保证用电安全】Acrel-6000安科瑞智慧安全用电解决方案

政策背景 国家部委 ※2017年5月3日国务院安委会召开电气火灾综合治理工作视频会议&#xff0c;决定在全国范围内组织开展为期3年的电气火灾综合治理工作。 公安部领导 ※公安部副部长李伟强调&#xff1a;向科技要战斗力&#xff0c;加快推进“智慧消防”建设不断提升火灾防控…