-
2019-11-05 15:13:53
有些程序在调试、兼容性、平台移植等情况下可能想要通过简单地设置一些参数就生成一个不同的软件,这当然可以通过变量设置,把所有可能用到的代码都写进去,在初始化时配置,但在不同的情况下可能只用到一部分代码,就没必要把所有的代码都写进去,就可以用条件编译,通过预编译指令设置编译条件,在不同的需要时编译不同的代码。
(一)条件编译方法
条件编译是通过预编译指令来实现的,主要方法有:
1、#if, #elif, #else, #endif
#if 条件 1
代码段 1
#elif 条件 2
代码段 2
...
#elif 条件 n
代码段 n
#else
代码段 n+1
#endif即可以设置不同的条件,在编译时编译不同的代码,预编译指令中的表达式与C语言本身的表达式基本一至,如逻辑运算、算术运算、位运算等均可以在预编译指令中使用。之所以能够实现条件编译是因为预编译指令是在编译之前进行处理的,通过预编译进行宏替换、条件选择代码段,然后生成最后的待编译代码,最后进行编译。
#if的一般含义是,如果#if后面的常量表达式为true,则编译它所控制的代码,如条件1成立时就编译代码段1,条件1不成立再看条件2是否成立,如果条件2成立则编译代码段2,否则再依次类推判断其它条件,如果条件1-N都不成立则会编译最后的代码段n+1.
2、#ifdef, #else, #endif或#ifndef, #else, #endif
条件编译的另一种方法是用#ifdef与#ifndef命令,它们分别表示“如果有定义”及“如果无定义”。有定义是指在编译此段代码时是否有某个通过 #define 指令定义的宏,#ifndef指令指找不到通过#define指令定义的某宏,该宏可以是在当前文件此条指令的前面定义的,也可以是在其它文件中,但在此指令之前包含到该文件中的。
#ifdef的一般形式是:
#ifdef macro_name
代码段 1
#else
代码段 2
#endif
或
#ifdef的一般形式是:
#ifndef macro_name
代码段 2
#else
代码段 1
#endif这两段代码的效果是完全一样的。
3、通过宏参数defined(macro_name)
参数为宏名(无需加""),如果该macro_name定义过则返回真,否则返回假,用该参数则可以写比较复杂的条件编译指令如:
#if defined(macro1) || (!defined(macro2) && defined(macro3))
...
#else
...
#endif(二)条件编译技巧与示例
1、#ifdef 和 #defined()比较
首先比较一下这两种方法,第一种方法只能判断一个宏,如果条件比较复杂实现起来比较烦锁,用后者就比较方便。如有两个宏MACRO_1,MACRO_2只有两个宏都定义过才会编译代码段A,分别实现如下:
#ifdef MACRO_1
#ifdef MACRO_2
代码段 A
#endif
#endif
或者
#if defined(MACRO_1) && defined(MACRO_2)代码段 A
#endif同样,要实现更复杂的条件用#ifdef更麻烦,所以推荐使用后者,因为即使当前代码用的是简单的条件编译,以后在维护、升级时可能会增加,用后者可维护性较强。旧的编译器可能没有实现#defined()指令,C99已经加为标准。要兼容老的编译器,还需用#ifdef指令。
2、#if 与 #ifdef 或 #if defined()比较
比如自己写了一个printf函数,想通过一个宏MY_PRINTF_EN实现条件编译,用#if可实现如下
#define MY_PRINTF_EN 1
#if MYS_PRINTF_EN == 1
int printf(char* fmt, char* args, ...)
{
...
}
#endif如果宏MY_PRINTF_EN定义为1则编译这段代码,如果宏定义不为1或者没有定义该宏,则不编译这段代码。同样也可以通过#ifdef或者#defined()实现,如下
#define MY_PRINTF_EN 1
#if defined(MY_PRINTF_EN)
int printf(char* fmt, char* args, ...)
{
...
}
#endif在这种情况下两种方法具有异曲同工之妙,但试想如果你为了节约代码写了两个printf函数,在不同情况下使用不同的printf函数,一个是精简版一个是全功能标准版,如:
#define MY_PRINTF_SIMPLE
#ifdef MY_PRINTF_SIMPLE
void printf(*str) // 向终端简单地输出一个字符串
{...
}
#endif#ifdef MY_PRINTF_STANDARD
int printf(char* fmt, char* args, ...)
{...
}
#endif
同样可以用#if defined()实现
#define MY_PRINTF_SIMPLE
#if defined(MY_PRINTF_SIMPLE)
void printf(*str) // 向终端简单地输出一个字符串
{
...
}
#elif defined(MY_PRINTF_STANDARD)
int printf(char* fmt, char* args, ...)
{
...
}
#endif两种方法都可以实现,但可见后者更方便。但试想如果你有三个版本,用前者就更麻烦了,但方法相似,用后者就更方便,但仍需三个宏进行控制,你要定义三个宏,改进一下就用#if可以用一个宏直接控制N种情况如:
#define MY_PRINTF_VERSION 1
#if MY_PRINTF_VERSION == 1
void printf(*str) // 向终端简单地输出一个字符串
{
...
}
#elif MY_PRINTF_VERSION == 2
int printf(char* fmt, char* args, ...)
{
...
}
#elif MY_PRINTF_VERSION == 3
int printf(unsigned char com_number, char* str)
{
...
}
#else
默认版本
#endif这样,你只需修改一下数字就可以完成版本的选择了
看来好像用#if 比较好了,试想如下情况:你写了一个配置文件叫做config.h用来配置一些宏,通过这些宏来控制代码,如你在config.h的宏
#define MY_PRINTF_EN 1
来控制是否需要编译自己的printf函数,而在你的源代码文件printf.c中有如下指令
#include "config.h"
#if MY_PRINTF_EN == 1
int printf(char* fmt, char* args, ...)
{
...
}
#endif但这样也会有一个问题,就是如果你忘了在config.h中添加宏MY_PRINTF_EN,那么自己写的printf函数也不会被编译,有些编译器会给出警告:MY_PRINTF_EN未定义。如果你有两个版本的想有一个默认版本,可以在printf.c中这样实现
#incldue "config.h"
#if !defined(MY_PRINTF_VERSION)
#define MY_PRINTF_VERSION 1
#endif
#if MY_PRINTF_VERSION == 1
void printf(*str) // 向终端简单地输出一个字符串
{
...
}
#elif MY_PRINTF_VERSION == 2
int printf(char* fmt, char* args, ...)
{
...
}
#elif MY_PRINTF_VERSION == 3
int printf(unsigned char com_number, char* str)
{
...
}
#endif这种情况下还得用到#ifdef或#if defined(),你可以不用动主体的任何代码,只需要修改printf.c文件中MY_RPINTF_VERSION宏的数字就可以改变了,如果用前面那种方法还得拖动代码,在拖动中就有可能造成错误。
再试想,如果软件升级了,或者有了大的改动,原来有三个版本,现在只剩下两个版本了,如
#if MY_PRINTF_VERSION == 2
int printf(char* fmt, char* args, ...)
{
...
}
#elif MY_PRINTF_VERSION == 3
int printf(unsigned char com_number, char* str)
{
...
}
#endif因为这些核心代码不想让使用这些代码的人关心,他们只需要修改config.h文件,那就要在printf.c中实现兼容性。如果以前有人在config.h配置宏MY_PRINTF_VERSION为1,即有
#define MY_PRINTF_VERSION 1
而现在没有1版本了,要想兼容怎么办?那当然可以用更复杂的条件实现如:
#if MY_PRINTF_VERSION == 2 || MY_PRINTF_VERSION == 1
int printf(char* fmt, char* args, ...)
{
...
}
#elif MY_PRINTF_VERSION == 3
int printf(unsigned char com_number, char* str)
{
...
}
#endif不过还有另外一种方法,即使用#undef命令
#if MY_PRINTF_VERSION == 1
#undef MY_PRINTF_VERSION
#define MY_PRINTF_VERSION 2
#endif
#if MY_PRINTF_VERSION == 2
int printf(char* fmt, char* args, ...)
{
...
}
#elif MY_PRINTF_VERSION == 3
int printf(unsigned char com_number, char* str)
{
...
}
#endif用#if还有一个好处,如果你把宏名记错了,把MY_PRINTF_EN定义成了MY_PRINT_EN,那么你用#ifdef MY_PRINTF_EN或者#if defined(MY_PRINTF_EN)控制的代码就不能被编译,查起来又不好查,用#if MY_PRINTF_EN ==1控制就很好查,因为你把MY_PRINTF_EN定义成MY_PRINT_EN,则MY_PRINTF_EN实际上没有定义,那么编译器会给出警告#if MY_PRINTF_EN == 1中的MY_PRINTF_EN没有定义,但错就比较快。
更多相关内容 -
C# #define条件编译详解
2020-08-31 19:10:00主要介绍了C# #define条件编译,告诉大家#define是用来做什么?如何使用#define,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
C语言宏条件编译详解
2020-07-31 10:49:38本文为大家详细讲解一下C语言宏条件编译。 -
《C深度解析》第二章 C预编译——宏定义、条件编译、头文件包含、特殊预编译关键字
2021-06-12 03:42:25(3)条件编译:#if、#else、#elif #endif、#ifdef和#ifndef、#if与defined、条件编译与配置文件(4)一些特殊的预编译关键字与实际应用:defined、#error、#line、#与##、#pragma (5)文件包含:是否只能包含.h... -
Java 条件编译 Conditional Compilation
2021-01-20 03:48:30根据Java编译器的优化的机制,Java也能够提供条件编译。对于条件设为false的语句,编译器将不对条件覆盖的代码段生成字节码。 不仅可以用简单的boolean常量值来做条件编译,还可以用字符串常量及任何其他类型的... -
c语言预处理和条件编译
2018-11-09 09:43:35学习c语言一些基本知识。 -
C#.NET学习笔记5 C#中的条件编译
2021-01-20 06:38:36条件编译是C#比Java多出的东西,但我跟前辈请教后,他们都说条件编译在实际的项目开发中不怎么使用.鉴于是新内容,我还是做做笔记,理解一下好了. 条件编译属于编译预处理的范畴,它能让我们通过条件编译的机制,将部分... -
条件编译应用举例-综合文档
2021-05-23 08:43:37条件编译应用举例-AT89S52单片机C语言应用100例 -
条件编译示例
2018-12-13 17:14:15顾名思义,条件编译指的是在某些特定条件下进行编译,满足条件时编译,不满足时不做处理。本代码中有使用#ifndef判别标识符和extern声明外部变量。 -
JScript的条件编译
2020-12-10 13:11:51微软对条件编译的解释是: 条件编译的某些典型用途包括使用 Jscript 中的新特性、在脚本中嵌入调试支持以及跟踪代码的运行。 先看一段代码简单的了解下: var s=0//@cc_on+1 alert(s) 如果你使用的是IE... -
条件编译
2019-07-03 18:26:27条件编译是根据实际定义宏(某类条件)进行代码静态编译的手段。可根据表达式的值或某个特定宏是否被定义来确定编译条件。 1.条件编译中使用的预编译指令 #define 定义一个预处理宏 #undef 取消宏的定义 #if 编译...条件编译是根据实际定义宏(某类条件)进行代码静态编译的手段。可根据表达式的值或某个特定宏是否被定义来确定编译条件。
1.条件编译中使用的预编译指令
#define 定义一个预处理宏
#undef 取消宏的定义
#if 编译预处理中的条件命令,相当于C语法中的if语句
#ifdef 判断某个宏是否被定义,若已定义,执行随后的语句
#ifndef 与#ifdef相反,判断某个宏是否未被定义
#elif 若#if, #ifdef, #ifndef或前面的#elif条件不满足,则执行#elif之后的语句,相当于C语法中的else-if
#else 与#if, #ifdef, #ifndef对应, 若这些条件不满足,则执行#else之后的语句,相当于C语法中的else
#endif #if, #ifdef, #ifndef这些条件命令的结束标志.
defined 与#if, #elif配合使用,判断某个宏是否被定义宏定义,按照是否带参数通常分为对象宏、函数宏两种。
对象宏: 不带参数的宏被称为"对象宏(objectlike macro)"。对象宏多用于定义常量、通用标识。例如://常量定义 #define PRICE 30 // 预编译宏 #define DEBUG
函数宏:带参数的宏。利用宏可以提高代码的运行效率: 子程序的调用需要压栈出栈, 这一过程如果过于频繁会耗费掉大量的CPU运算资源。 所以一些代码量小但运行频繁的代码如果采用带参数宏来实现会提高代码的运行效率。但多数c++程序不推荐使用函数宏,调试上有一定难度,可考虑使用c++的inline代替之。例如:
//最小值函数 #define MIN(a,b) (a<b?a:b)
2.常见的条件编译的三种形式
(1) #if defined(或者是ifdef) <标识符(条件)>
// 程序段
#endif
(2) #if !defined(或者是ifndef) <标识符(条件)>
//程序段
//endif
(3) #if ()
//程序段1
#elif ()
//程序段2
.......
#else
//程序段n
#endif
<标识>在理论上来说可以是自由命名的,但每个头文件的“标识”应该是唯一的。标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的“.”也变成下划线,如:stdio.h
defined用来测试某个宏是否被定义。defined(name): 若宏被定义,则返回1,否则返回0。
它与#if、#elif、#else结合使用来判断宏是否被定义,乍一看好像它显得多余, 因为已经有了#ifdef和#ifndef。defined的特点在于可在一条判断语句中声明多个判别条件,而#ifdef和#ifndef则仅支持判断一个宏是否定义。#if defined(VAX) && defined(UNIX) && !defined(DEBUG)
在判断某个宏是否被定义时,应当避免使用#if,因为if检查的是表达式。所以只定义宏,而没有指定宏的值时,要检查宏不能使用#if、#elif,而应当使用#ifdef或#ifndef,或者使用#if defined(宏)、#if !defined()。
检查表达式时,才用#if、#elif,并且只有当#if、#elif后面的表达式为真时,才执行后面的程序段
-
简单记录C# 条件编译
2021-01-20 05:52:48您可能感兴趣的文章:C# 编译生成dll文件供程序调用的两种方法C# #define条件编译详解C#实现将javascript文件编译成dll文件的方法C#命令行编译器配置方法C#中尾递归的使用、优化及编译器优化手动编译C#代码的方法 -
IE中jscript/javascript的条件编译
2020-12-04 08:35:00IE中jscript/javascript的条件编译 作者:JavaScript Kit 译者:子乌(Sheneyan) 翻译日期:2006-02-12 英文原文:Conditional Compilation of JScript/ JavaScript in IE 版权:翻译未经过javascript kit同意,我只对我所... -
C语言中条件编译详解
2020-08-30 11:58:09预处理程序提供了条件编译的功能。可以按不同的条件去编译不同的程序部分,因而产生不同的目标代码文件。这对于程序的移植和调试是很有用的。条件编译有三种形式,下面分别介绍。 -
uni-app的条件编译
2021-11-08 12:23:39uni-app的条件编译条件编译了解写法注意 条件编译了解 条件编译是用特殊的注释作为标记,在编译时根据这些特殊的注释,将注释里面的代码编译到不同的平台。 写法 以 #ifdef 或 #ifndef 加 %PLATFORM% 开头,以 #...条件编译了解
前言:
由于本次业务有 PC 端H5 页面,还有 手机端的H5页面,不同的端,模块展示可能不同,但是大部分功能又是相同的。
如果通过简单的 if…else… 判断不同端,调用相应的 API 或 展示相应的模块,那随着时间和业务的发展,终有一天会造成代码混乱,不好维护。
最重要的一点是在某特定的端上,存在大量的其他端的冗余代码,会增加文件体积,影响加载速度以及性能。
最好的方式就是可以根据端,打包出的代码只有和这个端有关系的代码,无其他冗余代码,这样干净也便于以后的维护。
这样就想到了 条件编译 。 uni-app 跨段框架就使用了 条件编译 。条件编译是用特殊的注释作为标记,在编译时根据这些特殊的注释,将注释里面的代码编译到不同的平台。
写法
以 #ifdef 或 #ifndef 加 %PLATFORM% 开头,以 #endif 结尾。
- #ifdef:if defined 仅在某平台存在
- #ifndef:if not defined 除了某平台均存在
- %PLATFORM%:平台名称
%PLATFORM% 可取值如下:
值 生效条件 VUE3 HBuilderX 3.2.0+ 详情 APP-PLUS App APP-PLUS-NVUE或APP-NVUE App nvue H5 H5 MP-WEIXIN 微信小程序 MP-ALIPAY 支付宝小程序 MP-BAIDU 百度小程序 MP-TOUTIAO 字节跳动小程序 MP-LARK 飞书小程序 MP-QQ QQ小程序 MP-KUAISHOU 快手小程序 MP-360 360小程序 MP 微信小程序/支付宝小程序/百度小程序/字节跳动小程序/飞书小程序/QQ小程序/360小程序 QUICKAPP-WEBVIEW 快应用通用(包含联盟、华为) QUICKAPP-WEBVIEW-UNION 快应用联盟 QUICKAPP-WEBVIEW-HUAWEI 快应用华为 支持的文件
- .vue
- .js
- .css
- pages.json
- 各预编译语言文件,如:.scss、.less、.stylus、.ts、.pug
注意
- 条件编译是利用注释实现的,在不同语法里注释写法不一样。
- js 使用
// 注释
- css使用
/* 注释 */
- vue/nvue 模板里使用
<!-- 注释 -->
;
- js 使用
- 条件编译APP-PLUS包含APP-NVUE和APP-VUE,APP-PLUS-NVUE和APP-NVUE没什么区别,为了简写后面出了APP-NVUE ;
- 使用条件编译请保证编译前和编译后文件的正确性,比如json文件中不能有多余的逗号;
- VUE3 需要在项目的 manifest.json 文件根节点配置 “vueVersion” : “3”
- Android 和 iOS 平台不支持通过条件编译来区分,如果需要区分 Android、iOS 平台,请通过调用 uni.getSystemInfo 来获取平台信息。支持ifios、ifAndroid代码块,可方便编写判断。
- 有些跨端工具可以提供js的条件编译或多态,但这对于实际开发远远不够。uni-app不止是处理js,任何代码都可以多端条件编译,才能真正解决实际项目的跨端问题。另外所谓多态在实际开发中会造成大量冗余代码,很不利于复用和维护。举例,微信小程序主题色是绿色,而百度支付宝小程序是蓝色,你的应用想分平台适配颜色,只有条件编译是代码量最低、最容易维护的。
- 有些公司的产品运营总是给不同平台提不同需求,但这不是拒绝uni-app的理由。关键在于项目里,复用的代码多还是个性的代码多,正常都是复用的代码多,所以仍然应该多端。而个性的代码放到不同平台的目录下,差异化维护。
-
C# 条件编译
2019-09-02 11:39:55此时就可以用到条件编译符,在不同的条件下编译不同的代码 和 C++ 差不多,在 C# 里面也有宏的概念,只是在 C# 里面的专业名词是条件编译符 通过 #if #else 这些预处理器指令,可以指定使用不同的代码参加...有一部分代码只是用来调试使用,不期望在发布的时候执行。也有一些代码只是用来测试性能,也不期望在其他时候使用。在做源代码包的时候,我需要对不同的平台使用不同的代码。此时就可以用到条件编译符,在不同的条件下编译不同的代码
和 C++ 差不多,在 C# 里面也有宏的概念,只是在 C# 里面的专业名词是条件编译符
通过
#if
#else
这些预处理器指令,可以指定使用不同的代码参加编译用法是在
#if
后面跟上条件判断逻辑,只要条件判断逻辑返回 true 那么在#if
包含的范围内的代码将会参加编译在
#if
包含的范围内指的是在#if
和下一个#else
或#elif
或#endif
指令之间的范围,和普通的条件判断逻辑相同#if NET45 // 添加代码 // 如果定义了 NET45 这个宏,那么在这个范围内的代码将会参加编译 #elif NET46 // 如果没有定义 NET45 这个宏,那么将会进入这个分支的判断,如果定义了 NET46 这个宏那么在这个范围内的代码将会参加编译 #else // 在上面的判断都不成立的时候,在这个范围内的代码将会参加编译 #endif
上面是使用最长的判断代码,而更多的只是其中的组合,如
#if xx
和#endif
的代码例如我指定了在 DEBUG 模式,也就是调试模式下执行和发布模式不同的输出
public void Foo() { #if DEBUG Console.WriteLine("Debug version"); #endif }
在有定义 DEBUG 宏的编译时候,也就是一般在调试的时候,将会编译下面代码
public void Foo() { Console.WriteLine("Debug version"); }
而在没有定义 DEBUG 条件编译符的时候,将会编译下面的代码
public void Foo() { }
可以注意到
Console.WriteLine("Debug version");
没有在没有定义 DEBUG 的时候参加编译,这段代码将被忽略这样就是预处理器指令命名的原因,表示在编译之前做的指令
在进行判断是否进行编译的时候,支持使用复杂的条件判断,包括使用运算符
==
(相等)和!=
(不相等)判断逻辑,在使用运算符的左边是对应的宏,右边是 true 和 false 两个值,其中 true 表示存在这个宏的定义,如下代码#if DEBUG == true #endif
上面代码的
#if DEBUG == true
和#if DEBUG
是等价写法另外还支持运算符
&&
(and)||
(or) 和!
(not) 连接多个判断此时的
#if DEBUG == false
和#if !DEBUG
是等价判断在使用连接符号的时候,支持添加
==
等判断运行符,也支持直接写条件编译符,如下代码#if NET45 || DEBUG == true // 在 NET45 定义或 DEBUG 定义的时候,这个范围内的代码可以执行 #endif
多个条件同时判断可以使用括号包含判断,请看代码
#if NET46 || (DEBUG == true && NET47) #endif
在定义了 NET46 或同时定义了 DEBUG 和 NET47 编译范围代码
更多预定义宏请看dotnet 新项目格式与对应框架预定义的宏
我搭建了自己的博客 https://blog.lindexi.com/ 欢迎大家访问,里面有很多新的博客。只有在我看到博客写成熟之后才会放在csdn或博客园,但是一旦发布了就不再更新
如果在博客看到有任何不懂的,欢迎交流,我搭建了 dotnet 职业技术学院 欢迎大家加入
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。 -
uniapp-条件编译
2020-03-18 19:54:31跨端兼容 uni-app 已将常用的组件、JS API 封装到框架中,开发者按照 uni-app 规范开发即可保证多平台... 编译到不同的工程后二次修改,会让后续升级变的很麻烦。 在 C 语言中,通过 #ifdef、#ifndef 的方式,为 ... -
Android.mk 条件编译
2022-02-08 20:06:24Android.mk $(warning " LOCALPATH is $(TARGET_PRODUCT)") ifeq ($(TARGET_ARCH), arm) LOCAL_CFLAGS += -DARM else ifeq ($(TARGET_ARCH), x86) LOCAL_CFLAGS += -DX86 else ifeq ($(TARGET_ARCH), mips... -
Android.bp条件编译
2019-10-30 14:10:15我们修改代码的时候经常会有一些共线的机器,我们只想进指定的机器或者指定的分支,在Android.mk中可以直接使用if来做判断,但是到了Android.bp中就无法在bp文件中使用条件编译了,本文将教会你怎么让bp文件也支持... -
C++条件编译详解
2018-11-28 21:26:57这就是“条件编译”。 其实这跟事物具有多样性一样。我们需要对不同的状况下采取不同的操作。例如程序的运行平台具有这种多样性,我们在window平台下编写的程序,可能使用某一个库或者与硬件相... -
Vc++ - 条件编译 - #pagma once
2021-11-10 17:27:24#pagma once是新版本编译器如:vs2013及以上的编译器创建头文件时会自动产生预处理编译指令,主要作用是防止重复定义和声明,在Linux中同样适用。 -
什么是条件编译
2020-07-13 22:15:13在介绍一些常见的条件编译指令之前,我们先简单连接一下翻译环境的构成 在这里我简单描述了一下编译环境的构成,我们即将要谈的条件编译,就是通过预处理阶段将一些语句加之条件,使之编译或者去掉。 下面我们谈谈几... -
VS条件编译
2020-05-28 10:42:59条件编译很实用,可以根据具体的业务场景启用某些代码,特定的生成对应的代码逻辑,比如现在要启用深圳ShenZhen的业务代码,如图下设置,在“条件编译和符号”中,设置自定义字符串"ShenZhen",然后在C#代码中写预... -
makefile条件编译实现
2019-07-19 09:00:32uboot 中没有Kconfig ,条件编译也就只能在makefile 中完成了,但是makefile 的语法是不支持像C语言中的预编译的宏运算 ifdef var2 || var2 || var3 +=a.o else +=b.o endif ... -
Keil_v5使用条件编译的小记录
2022-02-24 15:29:21#endif } } 上方可以看到,我们定义了两个条件HS5_DOW和HS5_UP,若需要使用则可以在keil5里面的工程选项里面的Define添加上HS5_UP和HS5_DOW即可,如下图所示。 如果是在同一个工程,两块相同的单片机共用一份...