c程序编译预处理命令那些事

预处理命令

#include(文件包含命令)
#define(宏定义命令)
#undef
#if(条件编译)
#ifdef
#ifndef
#elif
#endif
defined函数(与if等结合使用)

简述

我们在写程序是预处理命令的意思,用在什么地方,什么时候用,使用技巧在哪里

include(文件包含命令)

尖括号:#include <stdio.h>

尖括号:编译器会到系统路径下查找头文件
也就是说编译器安装目录的头文件用尖括号,象std库

双引号 :#include “usrctrl.h”

双引号:编译器会先在当前目录下查找头文件,如果没有找到,再到系统路径下查找
也就是说我们自己生成项目工程目录的头文件用双引号,

include的作用:是把包含文件内容写入c文件

包含文件一般是申明的头文件,但这不是绝对的,
他可以是c文件,一般c文件是独立的数组数据,方便维护
有时还可使其他文件,xxx.txt
u32 pcm_data[]={#includle “d:/xxx.txt”} 这样也可以,直接把txt文件初始化到数组里,但数据必须是数组接受的

int mapping_n8[256] = {
#include "mapping_n8.txt"
};

mapping_n8.txt里的内容是以逗号隔开的int型数据
‘’’
我们完全可以把其中部分代码放进另一个文件,比如file.txt,然后包含进来

#include <stdio.h>intmain(){int x,y;#include “file.txt”return 0;}//file.txtx = 3;y = 2;printf(%d\n”,x+y);

现实中,没人会这样写,这个例子就是为了演示include的本质局势简单的包含功能

比如我们定义了一个数组

元素非常多,放在源程序里影响看代码,可以放在另外的文本文件里保存,既让代码清爽,又易于修改和维护

//src.cchar *namelst[] = {#include “names.txt”};//names.txt“Tom”,“Jack”,......“vicky”

#include指令必须要独占一行 ,因为预处理器会将被包含的文件的全部内容从当前行的下一行开始插入,前后不为空白,就会出错

注意事项

1、一个 #include 命令只能包含一个头文件

2、同一个头文件可以被多次引入,多次引入的效果和一次引入的效果相同,因为头文件在代码层面有防止重复引入的机制

3、头文件包含允许嵌套

重要的话直说一遍,下面学习头文件在代码层面如何防止重复引入的机制

防止重复引入的机制:# ifndef

防止重复引入的机制:# ifndef 有多重用法

#ifndef <标识>
#define <标识>……#endif

一.头文件:tab_calc.h


#ifndef __TAB_CALC_H___
#define __TAB_CALC_H___
// #ifdef c_cplusplus
// extern "C" {
// #endif
#include "user_config.h"
//#define xDEBUG
#ifdef xDEBUG
#include <stdio.h>
#include <stdlib.h>
#define DEBUG_PRINT(fmt, ...) \do { \printf(fmt, ##__VA_ARGS__); \} while (0)
#define DEBUG_INFO(fmt, ...) \do { \printf(fmt, ##__VA_ARGS__);\ printf("Function: %s, File: %s, Line: %d\n", __FUNCTION__, __FILE__, __LINE__);\} while (0)
#define log_d(fmt, ...) \do { \printf(fmt, ##__VA_ARGS__); \printf("Function: %s, File: %s, Line: %d\n", __FUNCTION__, __FILE__, __LINE__); \} while (0)#else#define DEBUG_PRINT(fmt, ...) do {} while (0)
#define log_d(fmt, ...)  do {} while (0)
#define DEBUG_INFO(fmt, ...)  do {} while (0)
#endif#ifndef EXPORT__TAB_CALC_H___#define EXTERN#else#define EXTERN extern #endif typedef enum
{TABD6 = 0X00,   //  3*6  TABD8  , TABD10 , TABD12 , TABD14 ,TABD16                      
} d_tab_type;EXTERN s32* get_tab_data(u8 xtab);#undef EXTERN
/*******************************************/
// #ifdef c_cplusplus
// }
// #endif
#endif

#ifndef TAB_CALC_H_
#define TAB_CALC_H_
“中间内容”
#endif
意思是:在include时,__TAB_CALC_H___没有定义就写入"中间内容"到c文件 ,#ifndef __TAB_CALC_H___有没有被#define,写入"中间内容"到c文件
include的作用是把包含文件内容写入c文件:

例如:a.c include了三个头文件m.h n.h k.h tab_calc.h

这三个头文件m.h n.h k.h里面都包含了tab_calc.h,这时,“中间内容” 要在c文件重复写入四次,这样编译时,有四次重名错
但有了#ifndef就不样了,
在编译前,有一个编译预处理:
预处理先看__TAB_CALC_H___有没有被#define
m.h包含了tab_calc.h是第一个,__TAB_CALC_H___没有被#define,写入"中间内容"到c文件,同时__TAB_CALC_H___被#define
,后面__TAB_CALC_H___被#define,他遇到__TAB_CALC_H___就会跳出,不会写

有时间继续

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

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

相关文章

从0开始搭建一个生产级SpringBoot2.0.X项目(十)SpringBoot 集成RabbitMQ

前言 最近有个想法想整理一个内容比较完整springboot项目初始化Demo。 SpringBoot集成RabbitMQ RabbitMQ中的一些角色&#xff1a; publisher&#xff1a;生产者 consumer&#xff1a;消费者 exchange个&#xff1a;交换机&#xff0c;负责消息路由 queue&#xff1a;队列…

vue 使用腾讯地图

项目要求web端用若依框架引用腾讯地图 &#xff0c;搜了些配合官网完成后&#xff0c;记录中间的曲折&#xff0c; 一、引用vue web端引用腾讯地图 注册腾讯地图appkey WebService API | 腾讯位置服务 注意点 这是一个Vue集成腾讯地图的demo 项目中需要在index.html上…

牧神记开分9.7,2024新国漫巅峰出现了

现在国漫越来越卷了&#xff0c;卷播放量也卷评分。最近&#xff0c;b站上线不久的国漫《牧神记》开分9.7&#xff0c;口碑还是相当不错的&#xff0c;已经和《凡人修仙传》评分齐平。这部国漫仅仅播出4集&#xff0c;为什么就能获得这么高的评分呢&#xff1f;下面就一起来看看…

了解GPT大模型,读这本书就够了!(文末送书)

小异最近发现&#xff0c;当国外OpenAI的权力的游戏反转再反转的时候&#xff0c;国内的AI创业者们除了吃瓜之外也没闲着。 有很多程序员正在AIGC赛道中默默发财&#xff0c;有通过短视频做内容爆火&#xff0c;接广告的&#xff1b;有卖AI解决方案的&#xff1b;有卖AI课程的…

〔 MySQL 〕数据库基础

1. 数据库基础&#xff08;重点&#xff09; 1.1 什么是数据库 存储数据用文件就可以了&#xff0c;为什么还要弄个数据库?文件保存数据有以下几个缺点&#xff1a; ● 文件的安全性问题 ● 文件不利于数据查询和管理 ● 文件不利于存储海量数据 …

【软件工程】耦合

耦合性指软件结构中模块相互紧密连接的紧密程度。 耦合性由高到低分别为&#xff1a;内容耦合、公共耦合、外部耦合、控制耦合、标记耦合、数据耦合、非直接耦合。 1.内容耦合&#xff1a; 一个模块直接使用或修改另一个模块的内部数据或逻辑。 例如&#xff1a;一个函数直…

关于C++友元函数的优缺点和应用场景!

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于C 友元函数的相关内容&#xff01; 关于…

笔记本怎么开启TPM2.0_笔记本开启TPM2.0教程(不同笔记本开启tpm2.0方法)

在win11最低要求是提示&#xff0c;电脑必须满足 TPM 2.0&#xff0c;并开需要开启TPM 才能正常安装windows11系统&#xff0c;有很多笔记本的用户问我&#xff0c;笔记本怎么开启tpm功能呢&#xff1f;下面小编就给大家详细介绍一下笔记本开启tpm功能的方法。 如何确认你笔记本…

HTML5+css3(浮动,浮动的相关属性,float,解决浮动的塌陷问题,clear,overflow,给父亲盒子加高度,伪元素)

浮动的相关属性 以下使浮动的常用属性值&#xff1a; float&#xff1a; 设置浮动 以下属性&#xff1a; left : 设置左浮动 right : 设置右浮动 none &#xff1a;不浮动&#xff0c;默认值clear 清除浮动 清除前面兄弟元素浮动元素的响应 以下属性&#xff1a; left &…

Fastjson反序列化漏洞部署复现1.2.24版本反序列RCE笔记

环境部署 docker容器地址&#xff1a;https://github.com/vulhub/vulhub/tree/master/fastjson/1.2.24-rce 启动docker环境 docker容器每次一启动就报错 根据docker log [容器id] 查看报错日志发现有如下报错 library initialization failed - unable to allocate file desc…

PostgreSQL pg-xact(clog)目录文件缺失处理

一、 背景 前些天晚上突然收到业务反馈&#xff0c;查询DB中的一个表报错 Could not open file "pg-xact/005E": No such file or directory. 两眼一黑难道是文件损坏了...登录查看DB日志&#xff0c;还好没有其他报错&#xff0c;业务也反馈只有这一个表在从库查询报…

【Python】项目结构

【Python】项目结构 前言前置知识Python 的基本项目结构int main() 与 def main() 的区别举例&#xff1a;基于 KNN 的 OpenCV 数字识别的项目结构 前言 本文总结了 Python 项目结构的知识&#xff0c;规范项目结构能使得项目开发过程高效流畅&#xff0c;提升代码可读性、团队…

arcgis pro 学习笔记

二维三维集合在一起&#xff0c;与arcgis不同 一、首次使用&#xff0c;几个基本设置 1.选项——常规里面设置自动保存时间 2.新建工程文件&#xff0c;会自动加载地图&#xff0c;可以在选项里面设置为无&#xff0c;以提高启动效率。 3.设置缓存位置&#xff0c;可勾选每次…

OpenCV视觉分析之目标跟踪(11)计算两个图像之间的最佳变换矩阵函数findTransformECC的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 根据 ECC 标准 78找到两幅图像之间的几何变换&#xff08;warp&#xff09;。 该函数根据 ECC 标准 ([78]) 估计最优变换&#xff08;warpMatri…

.vue文件中定义变量和在引用的.ts文件中定义变量的区别

在 Vue 3 项目中&#xff0c;你可以在 .vue 文件和单独的 .ts 文件中定义变量。这两种方式有一些关键的区别&#xff1a; 在 .vue 文件中定义变量 局部作用域&#xff1a; 在 .vue 文件的 <script setup> 或 <script> 标签中定义的变量&#xff0c;它们的作用域仅限…

开源项目工具:LeanTween - 为Unity 3D打造的高效缓动引擎详解(比较麻烦的API版)之二———补间动画控制API系列

1.文档中的cancel,resume,pause LeanTween.cancel ( gameObject:GameObject id:int )LeanTween.cancel ( ltRect:LTRect id:int )LeanTween.cancel ( gameObject:GameObject )LeanTween.pause ( gameObject:GameObject )LeanTween.resume ( id:int )LeanTween.resume ( game…

Redis 典型应用 - 缓存(cache)

一、什么是缓存 缓存(cache)是计算机中的⼀个经典的概念.在很多场景中都会涉及到. 核⼼思路就是把⼀些常⽤的数据放到触⼿可及(访问速度更快)的地⽅,⽅便随时读取. 这⾥所说的"触⼿可及"是个相对的概念. 对于硬件的访问速度来说,通常情况下: CPU寄存器>内存>…

第十六章 TCP 客户端 服务器通信

文章目录 第十六章 TCP 客户端/服务器通信TCP 客户端/服务器通信TCP 连接概述TCP 设备的 OPEN 命令 第十六章 TCP 客户端/服务器通信 TCP 客户端/服务器通信 本章介绍如何使用 TCP/IP 在 IRIS 数据平台进程之间设置远程通信。 IRIS 支持两种互联网协议 (IP)&#xff1a;TCP …

【数学二】线性代数-矩阵-初等变换、初等矩阵

考试要求 1、理解矩阵的概念,了解单位矩阵、数量矩阵、对角矩阵、三角矩阵、对称矩阵、反对称矩阵和正交矩阵以及它们的性质. 2、掌握矩阵的线性运算、乘法、转置以及它们的运算规律,了解方阵的幂与方阵乘积的行列式的性质. 3、理解逆矩阵的概念,掌握逆矩阵的性质以及矩阵可…

DevCheck Pro手机硬件检测工具v5.33

前言 DevCheck Pro是一款手机硬件和操作系统信息检测查看工具&#xff0c;该软件的功能非常强大&#xff0c;为用户提供了系统、硬件、应用程序、相机、网络、电池等一系列信息查看功能 安装环境 [名称]&#xff1a;DevCheckPro [版本]&#xff1a;5.33 [大小]&a…