C语言的预处理问题

手把手教你学simulink实例--基于Simulink的航空发动机控制系统设计与仿真 航空发动机是飞机的核心动力装置,其性能直接影响飞行器的安全性、经济性和可靠性。现代航空发动机控制系统需要具备高精度、快速响应和强鲁棒性的特点,以适应复杂的飞行环境和任务需求。本项目旨在使用MATLAB/Simulink平台,设计并实现一种适用于涡扇发动机的闭环控制系统,通过调节燃油流量、压气机叶片角度等控制变量,确保发动机在不同工况下稳定运行,并满足推力需求。 阅读详情

今天在网上看到一个关于#error的预处理问题,很是困惑,没想到还有这种预处理命令,所以从网上系统得看了一下c语言的预处理命令!现总结如下,如有理解错误,欢迎大家批评指正!

首先,我们都知道整个程序从无到有的几个关键步骤:编译->链接->运行。其中,编译处于第一阶段,同时源代码编译和符号表的生成都在这个阶段。而且编译阶段再细分的话,分两个步骤:预编译->编译。我们所要关注的问题就是在预编译的阶段,在这个阶段,预编译器会重新扫描整个源文件代码,根据其中的预处理命令,重新排布源代码(删除一些无用的或是兼容性的代码),最后将产生的新的源代码文件,供给编译器进行编译(语言转化为机器码)。

预处理阶段,预处理器除了相应的源代码的转化工作外,还会删除多余的空白字符和代码注释。预处理器主要完成以下基本工作:包含其他源文件,宏定义,根据条件决定要编译的代码。下面单独的看一下,每个预编译命令所实现的预处理功能。

1. #include命令

#include命令主要是将其他源文件包含到现有的编译文件中,因为在其他.h文件中,存在我们需要使用的变量和函数声明。#include预处理命令后可以加入两种格式的.h文件,如下所示:

#include <stdio.h>

#include "my.h"

其中第一种方式,预处理器会在编译器自带的或外部库的头文件中搜索被包含的头文件。而第二种方式下,预处理器会在当前编译目录下,搜索要找的文件,如果找不到,则会搜索编译器自带的头文件。

2. #define 命令

#define主要产生宏定义命令,预处理器会扫描整个源文件,将有宏定义的地方全部替换成相应的表达式!主要的应用方式有两种,如下所示:

#define SECOND_PER_YEAR   (60*60*24*365)UL

#define MIN(A,B)      ((A) <= (B)? (A) : (B))

其中方式一中,预处理器会帮你计算出表达式的值,并且将整个源文件中,所有遇到的SECOND_PER_YEAR替换成计算出的表达式的值。在第二种方式中,属于带参数的宏的用法,类似于函数,不过宏只是简单的替换,并没有函数的参数传递过程和返回值。在第二种方式中,我们要注意以下几点:

a) 注意在参数宏的定义时,参数要加上括号,这样能避免其他不必要的歧义发生。

b) 三重条件操作符?:使得编译器能够产生比if-else更优化的代码,了解这个方法很重要。

c) 在使用带参数的宏时,有时会产生一些副作用,导致程序的运行方向,并不是预料的那样。

3. #undef

取消已经定义的宏,这个宏并不是很常用。

4#ifdef, #ifndef, #elif, #endif

以上这几个预编译命令都是条件编译命令,我们只以其中一个命令来举例说明,其他的命令与其类似。

#ifndef     MY_H

code

#endif      MY_H

条件编译的主要目的,是决定是否将其内的code保留在源文件中,输出给编译单元。其中最主要的用法有两种:

a) 在.h文件的开头加入#ifndef, 结尾处加入#endif,这样在其他源文件中,就能够保证因为多层include的下,产生的重复加入.h问题。

b) 在源代码中加入#ifdef, #endif可以增加代码的兼容性问题。在代码目录下的编译配置文件中,会定义一些编译宏,如果在源文件中加入对编译宏的判断,那么就可以决定是否将代码输出给编译单元。

#error

当预处理器遇到#error命令时,就会打印error后的消息到屏幕上,这时,开发人员就能够得知一下编译配置上的问题。例如:

# ifndef __cplusplus

#error It is not a c++  compiler

#endif

最后,我们来看一下,为什么会存在预处理命令。因为,我们看到在C语言的语法中不存在任何机制来完成一下的功能:a)包含其他源文件 b) 宏定义 c)根据条件决定是否包含某些代码。所以,以上的工作就由预处理器来做。

5宏定义中的#和##

##是一个连接符,用于把两个参数连接在一起。#符为“字符串化”的作用,作用是将#后的参数,转变成字符串,且如果宏定义中出现#,参数不再被展开!

例如:#define STRCPY(dst, src)   strcpy(dst, #src)

STRCPY(buff, abc)  => strcpy(buff, "abc")

例如:#define STRCPY(a,b) strcpy(a##_p, #b)

STRCPY(Var1, abc) => strcpy(Var1_p, "abc")

6 可变参数宏...和__VA_ARGS__

__VA_ARGS__为可变参数宏,属于C99中新增的宏定义。目前只有gcc支持,vc6.0并不支持此预定义宏。主要的用法为,在宏定义是参数列表最后一个参数为省略号,也就是三个点,代表参数可变。这样可变参数宏__VA_ARGS__就可以用在之后的替换部分,__VA_ARGS__代表可变的参数。在预编译阶段,编译器会将...所代表的字符串,原封不动的替换__VA_ARGS__的位置。

7. 嵌套宏

C语言允许嵌套宏的出现,且嵌套宏的展开方法与函数是大致类似的:先展开参数,然后再分析函数,即由内向外的方式!但要注意以下两点:

1)当宏定义中出现#时,参数不再展开

2)当宏定义中出现##时, 则为先展开函数,再展开参数。




Linux C/C++ or 嵌入式面试之《C/C++笔面试系列》(10) C++ 前置后置增减运算符重载形式与比较 C语言的++、–运算符在此不讨论。 文章目录1、前置后置增减运算符重载的形式2、前置和后置运算符的性能比较 1、前置后置增减运算符重载的形式 自增运算符“++”和自减运算符“–”分别包含两个版本。即运算符前置形式(如 ++x)和运算符后置形式(如 x++),这两者进行的操作是不一样的。因此,当我们在对这两个运算符进行重载时,就必须区分前置和后置形式。C++根据参数的个数来区分前置和后置形式。如果按照通常的方法来重载 ++ 运算符(即作为成员函数重载时不带参数,或者作为非成员函数重载时带有一个参数),那么重载 阅读详情

相关推荐

别再手动下单了!用Python+EasyTrader+同花顺,5分钟搞定你的第一个自动化交易机器人

本文详细介绍了如何使用Python和EasyTrader结合同花顺客户端快速构建自动化交易机器人。从环境配置到实战脚本编写,涵盖自动打新、条件单、跟单策略等核心功能,并分享性能优化与风险控制技巧,帮助投资者高效实现自动化交易。

weixin_30381317的博客 398

C语言的预处理命令的问题

预处理命令是在程序编译阶段进行执行的命令,用于编译与特定环境相关的可执行文件。预处理命令扩展了C语言。 一、宏替换命令 不用多讲,大家都懂。 #define 标识符 字符串 下面总结一些比较特殊的宏: 1、交换两个参数值 //一定要注意小括号的使用 #define SWAP(a,b) {(a)=(a)+(b); (b)=(a)-(b); (a)=(a)-(a);} 2、输入两个参数...

Y先生的自留地 2446

基于STM32的Keil5代码自动补全设置操作指南

掌握Keil5代码自动补全设置技巧,提升STM32开发效率。通过合理配置编辑器选项,实现智能提示与语法补全,让嵌入式编程更流畅,尤其适合使用keil5代码自动补全设置的开发者快速上手。

weixin_32287387的博客 761

C语言的预处理详解

说到预处理,大家绝对不会觉得陌生。因为我们在开始编写一份程序的时候,从键盘录入的第一句话: #include &lt;stdio.h&gt; 这里就使用了预处理,引入头文件。同时在文件开头我们常见的#define ,#ifdef,#pragma之类的都属于预处理。   那么,我们在此先提出几个问题: 1.预处理是C语言的一部分吗? 2.包含#号的都是预处理吗? 3.预处理指令后面是不...

Eyoru的博客 3万+

《中国图书馆图书分类法》(第五版)详表(中图分类号查询表)

中文法分类

记录我目之所及的世界 4万+

深入解析国家企业征信系统瑞数6vmp算法逆向实战

本文深入解析了国家企业征信系统所采用的双层防护机制,重点聚焦于瑞数6代vmp算法的逆向实战。文章详细拆解了从加速乐521状态码的绕过,到瑞数412挑战的核心算法还原过程,提供了通过动态Hook、日志分析进行算法逆向,并用Python实现自动化请求链的完整技术方案,旨在为安全研究与技术学习提供参考。

yellow的专栏 607

MySQL C API中的预处理语句

MySQL客户端/服务器协议提供了预处理语句。该功能采用了由mysql_stmt_init()初始化函数返回的MYSQL_STMT语句处理程序数据结构。对于多次执行的语句,预处理执行是一种有效的方式。首先对语句进行解析,为执行作好准备。接下来,在以后使用初始化函数返回的语句句柄执行一次或多次。 对于多次执行的语句,预处理执行比直接执行快,主要原因在于,仅对查询执行一次解析操作。在直接执行的情况下...

weixin_30847271的博客 229

从模组到集装箱:手把手拆解一个储能BMS的软硬件架构设计与通信组网

本文深入解析储能BMS的软硬件架构设计与通信组网,从电芯采样到系统集成的全链条技术实现。详细介绍了三级硬件架构(AFE、CMU、BMU)的设计要点,以及软件分层实现中的驱动层、应用层核心算法和通信协议栈。通过实战案例分享CAN网络搭建、调试工具链和系统验证测试经验,为储能系统开发提供实用指导。

weixin_30752699的博客 462

C语言预处理、编译和链接问题总结

C语言预处理和编译问题总结

qq_28576837的博客 1384

链接文件及功能安全:S32K3如何将FLASH驱动放到RAM里面、RAM如何实现软件复位数据不丢失操作。

在通过RTD的SDK也好MCAL也好,始终存在一个问题,生成的代码除了看门狗模块,默认都是放在flash里面,按照正常逻辑来看没啥大的问题,思考一个问题:Flash放在0x100的位置,但是此时我们要操作0x100怎么办?那肯定不允许啊,但是将flash的驱动放在RAM里面就可以避免这个问题的产生。Flash的特性:PF0能操作PF1,当然PF1也能操作PF0的,以此类推,只要不操作自身,想怎么玩都可以。这也是一个物理特性吧。

梦想技术家 2310

Python 爬虫项目:爬取百度贴吧帖子,保存标题与评论内容

在 Python 爬虫技术的学习与实战体系中,贴吧类动态内容爬取是典型的入门进阶案例,百度贴吧作为国内主流的社区论坛平台,其页面结构规范、数据载体清晰,非常适合用于巩固爬虫核心技术栈。本次实战项目基于requests请求库与解析库实现完整的爬取流程,从网页请求、数据解析、内容提取到本地持久化存储全链路落地,既能掌握基础爬虫的核心逻辑,也能理解网页结构化数据解析的通用思路,同时规避爬虫常见的反爬基础策略,具备极高的实战参考价值。本文核心价值。

2503_91057718的博客 2542

C语言编程常见问题解答之编译预处理(转载)

 本章集中讨论与预处理程序有关的问题。在编译程序对程序进行通常的编译之前,要先运行预处理程序。可能你以前没有见过这个程序,因为它通常在幕后运行,程序员是看不见它的,然而,这个程序非常有用。    预处理程序将根据源代码中的预处理指令来修改你的程序。预处理指令(如#define)为预处理程序提供特定的指令,告诉它应该如何修改你的源代码。预处理程序读入所有包含的文件和待编译的源代码,经过处理生成源代码

青青的专栏--C/C++ OOA/D Design Pattern 3351

SAP BSIS:总账未清项表(Open Items)总账未清项 包含哪些业务 请给以举例说明

SAP总账未清项是指需要未来核销的会计行项目,仅适用于勾选"未清项管理"的总账科目。典型业务场景包括:供应商预付款(借方未清项)、员工备用金(借方未清项)、客户预收款(贷方未清项)和保险理赔(借方未清项)。系统通过表BSIS/BSAS跟踪未清项,支持明细追踪和账实核对。核心价值在于提供总账级别的明细管理能力,确保往来款项完整清账,简化对账流程,满足特殊业务管理需求。可通过FBL3N事务码查询和管理所有总账未清项。

金牌架构师 723

运筹学指派问题c语言程序_5年程序员精髓总结—C语言预处理做了什么能答如下问题你就是大神...

C语言在预处理的时候都做了什么呢?#define #include #if你真的会用吗? 给你总结了以下常遇到的几个问题,本质理解了如下问题你将提升一个层次。10.1 这些机巧的预处理宏: #defifine begin { #defifine end } 你觉得怎么样? 10.2 怎么写一个一般用途的宏交换两个值? 10.3 书写多语句宏的最好方法是什么? 10.4 我第一次把一个程序分成多个...

weixin_36164462的博客 143

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

c语言的预处理有哪几种 各有什么作用,面试问题4:C语言预处理包括哪些

问题描述:C语言 预处理包括哪些操作C语言的三种预处理包括:宏定义(#define)、文件包含(#include)、条件编译(#if、#else、#endif)。对于宏定义的介绍:宏定义必须写在函数外,其作用域为宏定义起到源程序结束。C语言源程序中允许用一个标识符来表示一个字符串,称为“宏”。被定义为宏的标识符称为“宏名”。在编译预处理时,对程序中所有出现的宏名,都用宏定义中的字符串去代换,这称为...

weixin_42115074的博客 1877

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

c语言预处理指令后有意外标记,请问这段代码哪里有问题?

该楼层疑似违规已被系统折叠隐藏此楼查看此楼#include #include #include #pragma comment(lib, "PowrProf.lib")#include #include main(){GUID *MyselfScheme = NULL;PowerImportPowerScheme(NULL, "F:\\defultPowercfg.pow\\", &My...

weixin_39568889的博客 1084

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

python预处理c语言_你必须知道的C语言预处理的问题详解

C语言预处理器执行宏替换、条件编译和文件包含。通常采用以“#”为行首的提示。下面是C语言预处理的应用场合:1.三字母词(Trigraph Sequences)C源程序的字符集被包含在7位的ASCII字符集中,但是它是ISO 646-1983 Invariant Code Set的超集。为了让程序可以在缩减集(reduced set)中呈现出来,下面的三字母词会被替换成相应的单字符.三字母词单字符?...

weixin_35479284的博客 198

C语言的预处理。宏定义等问题

一般形式:#define 标识符 字符串字符串可以是常数,表达式,格式串等宏定义不是说明或语句,在行未不必加分号,如加上分号则连分号也-起置换宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。如要终止其作用域可使用 #undef 命令宏名在源程序中若用引号括起来,则预处理程序不对其作宏代换。宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名。宏展开时由预处理程序层层代换。习惯上宏名用大写字母表示,以便于与变量区别,但也允许用小写字可用宏定义表示数据类型,使书写方便。

2302_81386929的博客 1181

c语言双斜杠后面编译吗,你必须知道的C语言预处理的问题详解

C语言预处理器执行宏替换、条件编译和文件包含。通常采用以“#”为行首的提示。下面是C语言预处理的应用场合:1.三字母词(Trigraph Sequences)C源程序的字符集被包含在7位的ASCII字符集中,但是它是ISO 646-1983 Invariant Code Set的超集。为了让程序可以在缩减集(reduced set)中呈现出来,下面的三字母词会被替换成相应的单字符.三字母词单字符?...

weixin_30941189的博客 824

计算机二级c语言作弊技巧,2012年计算机等级考试二级C语言常见问题:C预处理器...

第 10 章 C 预处理器问题列表:10.1 这些机巧的预处理宏: #define begin { #define end } 你觉得怎么样?10.2 怎么写一个一般用途的宏交换两个值?10.3 书写多语句宏的最好方法是什么?10.4 我第一次把一个程序分成多个源文件, 我不知道该把什么放到.c 文件, 把什么放到.h 文件。(“.h” 到底是什么意思?)10.5 一个头文件可以包含另一头文件吗?...

weixin_35363895的博客 305

c语言iso校验算法,ISO C语言预处理问题及方法讨论

该楼层疑似违规已被系统折叠隐藏此楼查看此楼防。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。@whatofor摘录:5.1.1.2 Translation phases1 The precede...

weixin_32142311的博客 534

c语言编译计算机问题,2020计算机考研考研:C语言编译预处理问题

2020考研已经在紧张的复习中了,为了让大家更好的复习计算机考研,中公考研网校小编为参加2020考研的考生整理“2020计算机考研考研:C语言编译预处理问题”复习资料,希望能对各位考研人有所帮助。(一)无参宏定义无参宏定义的一般格式为:#define 标识符 字符串其中:“define”为宏定义命令;“标识符”为所定义的宏名。“字符串”可以是常数、表达式、格式串等。注意:(1)宏名一般用大写字母表...

weixin_34231032的博客 139

C语言的预处理常见问题(1)

本次博客来自于第一次学习预处理是的一些笔记吧,大家且看且珍惜实际上,预处理还有还有一些条件编译,以及如何生成目标文件的过程还是么有讲清楚,下次再说吧,这些笔记真是一个一个字纯手打的呜呜呜,还是祝看到这的兄弟们,天天健康开心。

comeonworld的博客 337

头文件自包含是什么意思_5年程序员精髓总结—C语言预处理做了什么能答如下问题你就是大神...

C语言在预处理的时候都做了什么呢?#define #include #if你真的会用吗? 给你总结了以下常遇到的几个问题,本质理解了如下问题你将提升一个层次。10.1 这些机巧的预处理宏: #defifine begin { #defifine end } 你觉得怎么样? 10.2 怎么写一个一般用途的宏交换两个值? 10.3 书写多语句宏的最好方法是什么? 10.4 我第一次把一个程序分成多个...

weixin_39850787的博客 1301

面试问题4:C语言预处理包括哪些

问题描述:C语言 预处理包括哪些操作   C语言的三种预处理包括:宏定义(#define)、文件包含(#include)、条件编译(#if、#else、#endif)。 对于宏定义的介绍:   宏定义必须写在函数外,其作用域为宏定义起到源程序结束。C语言源程序中允许用一个标识符来表示一个字符串,称为“宏”。被定义为宏的标识符称为“宏名”。在编译预处理时,对程序中所有出现的宏名,都用宏定义中...

weixin_30664539的博客 81

C语言运行2000秒后退出,C语言编程常见问题解答

本书从基本概念、基本技术、技术细节和疑难问题4个角度,分C语言、变量和数据存储、排序与查找、编译预处理等21个专题,收集了有关C程序设计的308个常见的问题。每一问题的解答都配有简明而有说服力的例子程序,相关的问题之间还配有详尽的交叉索引,C程序设计的初学者通过本收可以迅速完善自己的知识体系,并有效地提高自己的编程水平。¥26.18定价:¥125.42(2.09折)/1996-12-01这是一本忖...

weixin_32337913的博客 271
上一篇: linux内核原子操作的实现
下一篇: “asmlinkage” 的作用
计算机与认知
博客等级 码龄14年 31粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值