【C语言复习(九)】条件编译的使用与分析

STM32学习笔记之C语言复习+寄存器地址名称映射分析 STM32F4学习笔记之C语言复习+寄存器地址名称映射分析 C语言复习: 1.基本操作符,2. #define宏定义关键词,3.#ifdef条件编译,4.extern变量申明,5.typedef类型别名,6.static关键字,7.strcture,结构体:构造类型, 寄存器地址名称映射分析: 1.51中的映射方法,2.STM32中操作 阅读详情


1、基本概念:

条件编译的行为类似于if...else语句,只是在条件编译中,满足条件的才会被保留下来以备编译。

条件编译是预编译指示命令,用于控制是否编译某段代码。

 

示例:

#include <stdio.h>
 
#define COMMAND  1
int main()
{
    #if(COMMAND == 1)
        printf("COMMAND == 1");
    #else
        printf("COMMAND != 1");
    #endif
    return 0;
}

可以用gcc预编译一下,能看到预编译后的文件中,只剩下如下的内容:

int main()
{
 
        printf("COMMAND == 1");
 
 
 
    return 0;
}

很明显,条件编译和if...else是有本质区别的,不满足条件的代码不会被编译进最后的源代码中。

 

2、什么时候使用条件编译?

示例:建立如下三个文件,并写如下代码:

/*test.c*/
#include <stdio.h>
#include "test.h"
#include "global.h"
int main()
{
    printf("global=%d,num=%d,global*num=%d",global,num,func());
    return 0;
}

/*test.h*/
#include <stdio.h>
#include "global.h"
int num=10;
int func()
{
    return global*num;
}

/*global.h*/
int global=3;

试着编译一下test.c,会发现编译器报错,大概意思是已经定义了global变量,为什么会这样呢?使用命令行预编译一下,然后看.i文件,

预编译后生成的文件内容如下:

# 3 "test.c" 2
# 1 "test.h" 1
 
 
# 1 "global.h" 1
 
int global=3;
# 4 "test.h" 2
int num=10;
int func()
{
    return global*num;
}
# 4 "test.c" 2
# 1 "global.h" 1
 
int global=3;
# 5 "test.c" 2
int main()
{
    printf("global=%d,num=%d,global*num=%d",global,num,func());
    return 0;
}

可以看到,这里定义两次int global=3;,可是为什么会发生这种情况?

问题出在,我们在test.h和test.c中都包含了global.h文件,而test.c中又包含了test.h文件,这样在预编译阶段展开#include指令时,就把global.h文件展开了两次,而预编译器并不知道将此文件包含了两次,所以在编译阶段就发生了错误!

 

如何改正??

使用条件编译!

我们做如下的修改:

/*test.h*/
#include <stdio.h>
#include "global.h"
#ifndef _TEST_H_
#define _TEST_H_
int num=10;
int func()
{
    return global*num;
}
#endif // _TEST_H_
 
 
/*global.h*/
#ifndef _GLOBAL_H_
#define _GLOBAL_H_
int global=3;
#endif

再次编译,就没问题了!添加的条件编译的指令意思为:如果没有定义_GLOBAL_H_宏,则就保留里面的语句,否则就不保留,这样就能避免重复定义变量。

STM32 嵌入式学习入门(0)——C语言基础复习 摘要主要介绍了嵌入式编程中几个常用,但软件编程中用得不是很多的C语言知识。包括位操作、条件编译、结构体和结构体指针、typedef声明类型、以及extern变量声明、static关键字等内容。本文并没有将相关C语言知识点介绍地很详细,毕竟这么多知识点要想掌握绝对不是看几篇文档就能掌握的。因此博主建议,如果上述的C语言知识掌握得还不是很好的话,找一本C语言的书好好研究研究。尤其是结构体和结构体指针、还有函数的知识(本文没提到),一定要很熟练。 阅读详情

相关推荐

C语言复习题

5、有如下输入语句:scanf(“a=%d,b=%d,c=%d”,&a,&b,&c);为使变量a的值为1,b的值3,c的值为2,从键盘输入数据的正确形式应是。7、定义如下变量和数组: int i, x[3][3]={1,2,3,4,5,6,7,8,9};19、输入整数a、b,若a*a+b*b>100,则输出a*a+b*b的结果,否则输出a+b的结果。11、定义字符型变量a,b,c并使其初值为字符'd',以下错误的语句是( )。3、设整型变量n的值为2,执行语句“n+=n-=n*4”后,n的值是。

qq_30327395的博客 1324

完美解析C/C++条件预处理编译:#define、#if 、#ifdef、#elif、#endif

一、预处理的条件编译 预处理主要有三个方面的内容: 1.宏定义; 2.文件包含; 3.条件编译。 预处理命令以符号“#”开头。 二、常用指令 # 空指令,无任何效果 #define 定义宏 #undef 取消已定义的宏 #if 如果给定条件为真,则编译下面代码 #ifdef 如果宏已经定义,则编译下面代码 #ifndef 如果宏没有定义,则编译下面代码 #elif 如果前面的#if给定条件不为真,当前条件为真,则编译下面代码 #elif预处理指令

源代码杀手的博客 6098

C语言考研复习与历年试题解析

C语言是一种广泛使用的计算机编程语言,由Dennis Ritchie在1972年设计并实现。作为一种结构化的编程语言,C语言以其高效性、灵活性和强大的操作能力闻名。它是许多现代高级语言的基石,包括C++和Objective-C。对于IT从业者而言,掌握C语言是理解计算机内存模型和系统编程不可多得的基础。int data;// 数据域// 指针域,指向下一个节点} Node;函数是C语言中实现代码复用的基础。涉及函数的定义、声明和调用。// 示例代码:函数定义和调用return 0;

weixin_42611177的博客 1120

【C/C++ 基础】条件编译相关的预编译指令

在C/C++编程中,预处理器(Preprocessor)是一个非常有用的工具,它在编译过程之前对代码进行预处理。预处理器可以用于包含头文件、定义宏、条件编译等。本文将详细介绍C/C++中常用的预处理器指令,并通过实例来解释它们的用法和底层工作原理

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 415

2018硕士研究生C语言与数据结构综合复习指南

本文还有配套的精品资源,点击获取 简介:本文档是一个针对2018年硕士研究生入学考试的C语言编程和数据结构复习资料包,涵盖练习题、历年真题、解题思路以及教学材料。内容包括数据结构的核心概念、C语言的特性及其在不同领域中的应用,以及考试真题的分析。考生需要深入理解C语言的基础语法、数据结构的操作,熟悉算法及其时间复杂度,并通过大量练习来提升编程和问题解决能力。 1....

weixin_33812391的博客 1576

CentOS 7下kkFileView 4.4.0离线部署全攻略(含LibreOffice 7.5配置避坑指南)

本文详细介绍了在CentOS 7环境下离线部署kkFileView 4.4.0的全流程,包括LibreOffice 7.5的配置避坑指南、中文字体解决方案以及企业级运维实践。通过本指南,用户可以在内网环境中快速搭建稳定可靠的文档在线预览服务,提升办公效率。

weixin_28481133的博客 291

c语言学习笔记(12)条件编译使用分析

摘要:总结了条件编译和if else的区别,#include在包含头文件时候的注意点,使用条件编译避免重复包含头文件,最后给出一个实例加深理解。 一、什么是条件编译      我们在移植u-boot和linux内核的时候,经常会看到#ifdef…#endif或者#ifndef…#endif这样的代码,这个就是条件编译,总的来说:     1.条件编译行为类似if…else,都是条件

Deep_l_zh的博客 1191

GCdepth散点图绘制

基因组组装完成后,需要对组装结果进行评估,其中GC_depth图是一个比较重要的指标,改图的横坐标是GC含量,纵坐标是平均深度。以30k为窗口(window)无overlap计算其GC含量和平均深度。如果存在样品污染,通常能够从GC含量分析中呈现出来。下文探索了几种绘制GC_depth散点图的方法思路。

huangliangbo的专栏 8993

C语言基础入门48篇_番外篇_条件编译(预处理中的条件编译是一种可以决定编译哪些代码的机制、#if...#endif、#if和defined,非defined相结合/#ifdef和#ifnde)

在C语言中有一种机制可以决定编译哪些代码,这个机制就是预处理中的条件编译。本篇主要介绍常用的判断语句。 总结如下: 1.判断语句条件编译#if…#endif的使用 2.是否被定义: #if预处理和defined,!defined预处理相结合的方式 使用简写的#ifdef和#ifndef的形式 3.多重判断#if…#elif…#else…#endif 4. .h文件中条件编译语句的含义 使用条件编译,你可以选择代码的一部分是否被正常编译,C中条件编译的主要形式有三种。 1.判断语句条件编译#if...#e

分享学习成长历程,Winter is coming! 1384

F5 GTM DNS 实战指南:智能DNS的监控与健康检查机制

本文深入解析F5 BIG-IP GTM智能DNS的核心机制,重点阐述其监控与探针两大功能如何协同工作。监控器负责深度检查服务器应用健康,确保服务可用性;探针则实时测量网络路径质量,实现基于延迟的智能流量调度。文章通过实战配置步骤,指导如何构建逻辑架构、建立iQuery通信、配置业务级健康检查及探针,从而构建高可用、高性能的全局负载均衡解决方案。

weixin_29240711的博客 472

ADS笔记,新旧两组仿真数据进行绘图和列表对比

原理图器件参数的不同,怎么进行对比观看,操作如下。

彭辉荣的博客 3870

条件编译使用分析

编译预处理专题三:编译预处理。包括以下章节: 编译过程简介 宏定义与宏使用分析 条件编译使用分析 #error和#line #pragma预处理分析 #和##运算符使用解析 基本概念 条件编译的行为类似于c语言中的if…else…语句 条件编译是预编译指示命令,用于控制编译哪一段代码 条件编译对预编译器起作用;if…else…在运行时起作用 #if()…#else…#endif 判断条件表达式 #

wuyadeCS的专栏 457

【文献笔记】ICCV 2021 | Point Transformer

作者提到,特别适合点云处理,因为自注意力机制是的核心,本质上就是一个集合算子:它对输入元素具有顺序不变性和数量不变性3D点云是无序的,即使改变点云txt文件中的点顺序也不会有任何影响。自注意力机制天然具有排列不变性,因为它通过对所有"点对"的关系进行建模来处理输入,而不依赖于任何特定的输入顺序点云数据通常覆盖了3D空间中的对象或场景,理解这些数据需要捕捉点与点之间复杂的空间关系。自注意力机制能够有效的捕捉这些关系,因为它为每个"点对"赋予一个。

m0_55908255的博客 966

C语言复习

本文通过菜鸟教程、《C程序设计》课本以及课件对C语言难点进行复习梳理 C语言知识点大概梳理图 文章目录一、程序设计基础1、语言对比 [1]2、结构化程序设计3、面向对象程序设计4、C程序开发步骤二、数据类型与表达式1、数据类型2、进制计数3、信息存储单位4、常量(Constant)5、存储类别6、运算符三、程序控制结构1、格式化输出四、函数1、函数声明和函数原型2、标准库函数2、内联函数3、全局变量五、预处理命令1、文件包含2、条件编译六、数组1、多维数组作为函数的参数2、字符数组七、指针1、行位移量与元

MAN_Sue的博客 2270

基于STM32设计的ECG+PPG人体参数测量系统(华为云IOT)(217)

该系统的核心是基于STM32F103RCT6微控制器,这是一种高性能、低功耗的嵌入式处理器,适用于各种复杂的控制和数据处理任务。系统利用先进的传感器技术,如光电传感器PulseSensor模块来准确测量人体脉搏血氧饱和度及心率(PPG),同时采用AD8232生物电信号采集模块捕捉并处理人体的心电图信号(ECG),从而全面反映用户的心脏活动状态。

1万+

图像拼接(Image Stitching)

图像拼接(Image Stitching):是一项计算机视觉技术,它将多张重叠的图像合并为一张更大、无缝的全景图或广角视图。该技术广泛应用于全景摄影、地图制作、医学影像处理、计算机视觉及增强现实(AR)等领域。

📷 图像处理践行者 | 传统算法 · 深度学习 · 多模态 | 分享实战经验与技术洞见,探索从像素到智能的无限可能。 2506

【C语言1】C语言常见概念(总结复习篇)——库函数、ASCII码、转义字符

这一个月打算写一些C语言的内容,也用于复习总结,一月中旬会再开始写数据结构。祝福大家期末都取得理想的成绩,可千万别挂科了哦!

Uu_05kkq的博客 4711

安卓刷Windows太难?这款手机平板双系统刷机工具,小白也能轻松拿捏!(小白福音!手机平板专用,一键搞定安卓刷 Windows 双系统!)

安卓刷Windows太难?这款手机平板双系统刷机工具,小白也能轻松拿捏!(小白福音!手机平板专用,一键搞定安卓刷 Windows 双系统!)

XiaoqiangClub的博客 4683

复习c语言深度剖析(22)—条件编译使用分析

1.基本概念 条件编译的行为类似于C语言中的if…else…;  条件编译是预编译指示命令,用于控制是否编译某段代码;  可以利用预处理器调整代码、删除代码的操作。 2.编程实验 条件编译初探  //#include<stdio.h> #define C 1 int main() { const char* s; #if(1 == C) s = “this...

weixin_43478148的博客 178

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

【C语言复习】常见概念(零基础)

通过这篇博客,你将对C语言有一个全面的了解,为进一步的学习和实践打下坚实的基础。无论你是初学者还是有经验的开发者,这些核心概念都是提升编程技能不可或缺的部分。

ChiaWei_Lee的博客 1542

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【C语言预处理器全解析】宏、条件编译、字符串化、拼接

本文全面解析了C语言预处理器功能,涵盖宏定义、条件编译等核心知识点。主要内容包括: 预处理器基础:在编译前处理宏展开、注释删除、条件编译等任务 宏定义详解: #define常量和宏函数的正确写法 必须用括号包裹参数避免优先级问题 警惕宏参数副作用(如i++)导致的多次求值 高级特性: #运算符实现参数字符串化 ##运算符进行标识符拼接 宏与函数的适用场景对比 实用技巧: 预定义符号(__FILE__等)的调试应用 条件编译的多种形式(#if/#ifdef) 头文件重复包含的防护方案 文章通过大量代码示例和常

2301_80228652的博客 1175

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

C语言知识复习及拓展

数组就是一个可以存储相同类型元素的顺序集合。按维度来划分,数组分为一维数组和多维数组。按数组的内存大小是否可变来划分,数组可以分为静态数组和动态数组。指针是一种数据类型,用于存储内存地址的整数。指针变量就是使用这种数据类型定义的变量,其存储的值是另一个变量的地址。链表是一种物理存储上非连续,数据元素的逻辑顺序通过链表中的指针链接次序实现的一种线性存储结构。数据域指针域。数据域存储数据元素,而指针域存储下一个节点地址。链表有多种类型,包括单向链表、双向链表、循环链表等。单向链表。

m0_65960610的博客 1128

C 语言复习总结记录三

自定义函数和库函数一样,有函数名,返回值类型和函数参数,但由程序员自己设计编写函数,找出两个整数中的最大值;编写函数,交换两个整形变量的内容x : y;//原理, 两次异或的结果等于原值return 0;函数声明:仅提供函数名,参数和返回类型,不提供参数体,一般放在头文件中函数定义:指函数的具体实现,交待函数的功能实现//函数声明int Add(int x, int y) //函数实现return x+y;递归 :程序调用自身的编程技巧称为递归(recursion)

优质后端技术知识记录 1494

C语言的期末复习

🌟本文由卿云阁原创!🙏作者水平很有限,如果发现错误,请留言轰炸哦!

zzqingyun的博客 2823

c语言的部分复习+数据结构部分复习总结

这里主要是关于typedef这个关键字的使用。typedef 数据类型 别名在使用结构体时,每次声明结构体都要写struct关键字很麻烦,而typedef就可以解决这个问题。typedef struct 结构体名 //根据个人习惯,这一排的结构体名可以不写数据类型 变量名;数据类型 变量名;……}别名;int x;int y;}point;point p;由n个数据特性相同的元素构成的有限序列称为线性表。线性表中元素的个数n定义为线性表的长度,当n=0时称为空表。

2403_88557281的博客 667

鹏哥C语言复习——程序的编译、链接和预处理

C语言设置了一些预定义符号,可以直接使用,预定义符号也是在预处理阶段处理的。1 __FILE__ //进行编译的源文件2 __LINE__ //文件当前的行号3 __DATE__ //文件被编译的日期4 __TIME__ //文件被编译的时间5 __STDC__ //如果编译器遵循ANSI C(C语言标准),其值为1,否则未定义1是为了找到文件所在位置,2是指使用__LINE__语句的行号,不是所有编译器都遵循ANSI C(例如vscode2022)经过预处理以后,预定义符号已经替换成当前数据了。

2302_80297338的博客 1296
上一篇: Windows 下实现gcc 命令行编译
下一篇: 【C语言复习(十)】#error与#warning、#line、#与##的简单使用
CMbug
博客等级 码龄12年 36粉丝 122原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值