C语言的预处理问题

手把手教你用EGM96模型校正DEM数据(含在线工具推荐) 本文详细介绍了如何使用EGM96地球重力场模型校正DEM数据中的高程偏差。通过对比WGS84椭球面与大地水准面的差异,解释了校正原理,并提供了从在线工具快速验证到Python脚本批量处理的全流程实战指南,帮助GIS开发者和数据分析师确保高程数据基准一致,提升空间分析精度。 阅读详情

今天在网上看到一个关于#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)当宏定义中出现##时, 则为先展开函数,再展开参数。




逆向分析踩坑记:当Frida在x86模拟器上‘看不见’ARM的so文件时,我们该如何手动定位与验证? 本文探讨了在x86模拟器上使用Frida进行逆向分析时,无法检测到ARM架构so文件的解决方案。通过分析内存映射、Frida的视觉盲区及手动定位技术,提供了兼容层、混合调试和原生ARM环境三种实用方案,帮助逆向工程师突破工具限制,实现精准定位与验证。 阅读详情

相关推荐

CAPL实战:从零构建HEX文件解析器,赋能UDS刷写

本文详细介绍了如何使用CAPL从零构建HEX文件解析器,以支持UDS刷写操作。通过解析HEX文件格式、设计状态机、优化数据结构与算法,实现高效准确的固件数据处理,并提供了与UDS刷写流程对接的工程化实践建议。

weixin_28726391的博客 442

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

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

Y先生的自留地 2446

AU混响终极指南:从‘干声’到‘空间感’,用总音轨和发送技巧打造专业人声

本文详细介绍了如何在Adobe Audition(AU)中使用混响效果器,通过总音轨和发送技巧将‘干声’转化为具有专业‘空间感’的人声。从混响基础原理到总线架构设置,再到精细控制和自动化调整,全面解析了提升音频质量的实用技巧,适用于音乐制作、播客和内容创作。

weixin_30512089的博客 331

C语言的预处理详解

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

Eyoru的博客 3万+

系统动力学仿真软件Vensim下载

Vensim是由美国Ventana Systems, Inc.所开发,是采用图示化编程的方式构建系统动力学模型,上手简单。Vensim有很多系列产品,其中Vensim PLE (Personal Learning Edition)是面向个人学习者的,完全免费,可直接官网下载,截止于2022/04/10,最新的Vensim PLE版本是9.2.3。

PMIIᶜᶜ的博客 1万+

从Delta Delay到Timing Window:详解数字芯片后端时序差异的那些坑

本文深入剖析了数字芯片后端设计中,模块级与系统级时序分析结果不一致的核心原因。重点解释了Delta Delay如何导致模块级分析的乐观假设,以及Timing Window(时序窗口)差异如何通过影响串扰噪声计算,在顶层集成时引发新的时序违例,尤其是保持时间问题。文章为工程师提供了从约束建模到签核策略的系统性应对方案。

beer8的博客 498

MySQL C API中的预处理语句

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

weixin_30847271的博客 229

Microsemi Libero使用技巧11——CoreUARTAPB RX管脚分配时不显示

调用串口IP核CoreUARTAPB,并例化到顶层设计,发现UART_RX管脚在进行管脚分配时没有显示出来,最后发现是CoreAPB3总线IP核配置不对导致,改为如下配置后正常。

whik1194的博客 756

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

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

qq_28576837的博客 1384

SAP UI5 OData V4 操作结果访问:从 getObject 到返回值上下文与 $$inheritExpandSelect

SAP UI5 OData V4 操作结果获取指南 摘要:在 SAP UI5 OData V4 模型中,操作结果需通过绑定上下文获取而非直接从 invoke() 返回。本文详解核心要点: 数据获取路径 使用 invoke() 发起请求后,通过 getBoundContext().getObject() 获取结果 特定场景下 invoke() 可能返回返回值上下文(如草稿切换) 关键实践技巧 使用 $$inheritExpandSelect 继承字段选择,避免二次读取 对象页应用中,通过替换绑定上下文实现无缝

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 310

MATLAB应用实战系列(七十七)-基于长时间序列栅格数据的MK检验

1 MK检验介绍 MK检验是曼-肯德尔法,又称Mann—Kenddall 检验法,是一种气候诊断与预测技术,应用Mann-Kendall检验法可以判断气候序列中是否存在气候突变,如果存在,可确定出突变发生的时间。Mann-Kendall检验法也经常用于气候变化影响下的降水、干旱频次趋势检测。目前常用于长时间序列的栅格数据的显著性检验,在植被覆盖度,NDVI,NPP等方面尤为常见。 该检验功能强大,不需要样本遵从一定的分布,部分数据缺失不会对结果造成影响,不受少数异常值的干扰,适用性强。不但可以检验时

wenyusuran的专栏 6289

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

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

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

计算机等级考试(二级WPS)---真题14套

目录 真题14一、选择题二、WPS文字三、WPS表格四、WPS演示21.打开考生文件夹下的素材文档 “WPS.docx”(.docx 为文件扩展名),后续操作均基于此文件,否则不得分。小周正在整理一份关于极光的文档,请按要求帮助她完成文档的排版工作。1.将全文中的手动换行符全部替换为中文句号并回车,删除文中的空行和空格。2.将正文第 2 段(“在我國的古書…… 極光”)中的繁体字转换成简体字,并为其设置 “正文” 样式。3.对文档样式进行如下设置:4.为 “1.3 极光的形态” 一节中列出的五种极光形态特征

2401_82750246的博客 1165

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

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

weixin_36164462的博客 143

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

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

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

weixin_42115074的博客 1877

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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

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

weixin_39568889的博客 1084

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

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、付费专栏及课程。

余额充值