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

C primer plus 复习题答案(上) C primer plus 复习题答案 第一章 初识C语言 ​ 对编程而言,可移植性意味着什么 在软件工程中,可移植性,又译为移植性、可携性,是指使用高阶语言写成的软件,在同环境下,是否具备可以被重复使用的性质。一般来说,软件是否具备可移植性的衡量标准,在于进行软件移植时,需要付出多少工时为代价。具备高可移植性的软件,在移植到同系统平台时,并需要做太多事情,因此能够减少软件开发及布署时的成本。为了使软件具备高度可移植性,程序员需要使应用程序界面抽象化以及模组化。 以低阶语言,例如汇编语言,写成的软 阅读详情


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

相关推荐

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

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

weixin_42611177的博客 1100

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

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

Deep_l_zh的博客 1189

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

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

weixin_33812391的博客 1570

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

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

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

条件编译使用分析

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

wuyadeCS的专栏 453

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! 1377

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

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

源代码杀手的博客 6021

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的博客 2263

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

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

Uu_05kkq的博客 4702

复习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

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

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

ChiaWei_Lee的博客 1537

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

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

2301_80228652的博客 1165

【C语言条件编译的用法(预处理)

如果我想在一个程序内自由切换TCP_Server和TCP_Client两个函数,同时有要求两个函数能同时运行,如果使用传统的屏蔽功能固然可以,但是屏蔽来屏蔽去,来回切换,屏蔽起来也很方便,时间久了我们就搞懂程序为什么要屏蔽,弊端很大。由此我们引入了条件编译这样好的方法

Roger_717的博客 3897

浅谈 C/C++ 的条件编译

1.条件编译的时机 我们都知道vscode其实是一个编辑器,你要在上面跑C或者C++你需要配置编译器,拿编译器是怎样吧一个文本文件变成一个可执行文件的呢? 那必然是经历以下这四步 预处理:宏替换,头文件的展开,去注释,条件编译 编译:将预处理后的源文件转换为汇编语言文件,只编译源文件,编译头文件,头文件在刚刚预处理阶段已经展开。 汇编:虽然叫做汇编,但是是转变为汇编代码,而是将刚刚的汇编语言文件转换为机器码,也就是二进制文件。 链接:将生成的二进制代码库函数以及其他目标文件,通过链接器链接

qq_50119037的博客 7547

C语言条件编译例程

1.条件编译概念:一般情况下,源代码文件中的所有行都参加编译,但有时需要指定一部分代码在某个条件下才被编译,这就叫做条件编译。2、条件编译详解条件编译发生在预处理阶段,在C中,主要通过#if、#elif、#else、#ifdef、#ifndef、#endif来给一段代码附加上编译条件,然后预处理器收集满足条件的可以进行编译的代码,这样经过预处理,满足条件的代码就会被编译。3.预处理指令用法可以...

richardgann的博客 1371

条件编译使用实例

#include <stdio.h>#define C 1int main(){ #if( C == 1 ) printf("This is first printf...\n"); #else printf("This is second printf...\n"); #endif return 0;} 转载于:https:...

weixin_33836223的博客 197

c语言编译预处理和条件编译执行过程的理解

    在C语言的程序中可包括各种以符号#开头的编译指令,这些指令称为预处理命令。预处理命令属于C语言编译器,而是C语言的组成部分。通过预处理命令可扩展C语言程序设计的环境。 一.预处理的工作方式 1.1.预处理的功能   在集成开发环境中,编译,链接是同时完成的。其实,C语言编译器在对源代码编译之前,还需要进一步的处理:预编译。   所以,完整的步骤是:预编译 -&gt; 编译 -&gt...

weixin_34211761的博客 387
上一篇: Windows 下实现gcc 命令行编译
下一篇: 【C语言复习(十)】#error与#warning、#line、#与##的简单使用
CMbug
博客等级 码龄12年 36粉丝 122原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值