C语言条件编译详解

我们要开发一个C语言程序,让它输出红色的文字,并且要求跨平台,在 Windows 和 Linux 下都能运行,怎么办呢?

这个程序的难点在于,不同平台下控制文字颜色的代码不一样,我们必须要能够识别出不同的平台。

Windows 有专有的宏_WIN32,Linux 有专有的宏__linux__,以现有的知识,我们很容易就想到了 if else。

示例

#include <stdio.h>
int main(){if(_WIN32){system("color 0c");printf("http://www.baidu.com\n");}else if(__linux__){printf("\033[22;31mhttp://www.baidu.com\n\033[22;30m");}else{printf("http://www.baidu.com\n");}return 0;
}

但这段代码是错误的,在 Windows 下提示 linux 是未定义的标识符,在 Linux 下提示 _Win32 是未定义的标识符。对上面的代码进行改进:

#include <stdio.h>
int main(){#if _WIN32system("color 0c");printf("http://www.baidu.com\n");#elif __linux__printf("\033[22;31mhttp://www.baidu.com\n\033[22;30m");#elseprintf("http://www.baidu.com\n");#endifreturn 0;
}

#if、#elif、#else 和 #endif 都是预处理命令,整段代码的意思是:如果宏 _WIN32 的值为真,就保留第 4、5 行代码,删除第 7、9 行代码;如果宏 linux 的值为真,就保留第 7 行代码;如果所有的宏都为假,就保留第 9 行代码。

这种能够根据不同情况编译不同代码、产生不同目标文件的机制,称为条件编译。条件编译是预处理程序的功能,不是编译器的功能。

条件编译需要多个预处理命令的支持。

#if 的用法

#if 用法的一般格式为: 
#if 整型常量表达式1程序段1
#elif 整型常量表达式2程序段2
#elif 整型常量表达式3程序段3
#else程序段4
#endif

解说:如常“表达式1”的值为真(非0),就对“程序段1”进行编译,否则就计算“表达式2”,结果为真的话就对“程序段2”进行编译,为假的话就继续往下匹配,直到遇到值为真的表达式,或者遇到 #else。这一点和 if else 非常类似。

注意,#if 命令要求判断条件为“整型常量表达式”,也就是说,表达式中不能包含变量,而且结果必须是整数;而 if 后面的表达式没有限制,只要符合语法就行。这是 #if 和 if 的一个重要区别。

#elif 和 #else 也可以省略,如下所示:

#include <stdio.h>
int main(){#if _WIN32printf("This is Windows!\n");#elseprintf("Unknown platform!\n");#endif#if __linux__printf("This is Linux!\n");#endifreturn 0;
}

#ifdef 的用法

#ifdef 用法的一般格式为: 
#ifdef  宏名程序段1
#else程序段2
#endif

解说,如果当前的宏已被定义过,则对“程序段1”进行编译,否则对“程序段2”进行编译。

也可以省略 #else:

#ifdef  宏名程序段
#endif

为了能够清楚地看到当前程序的编译模式,我们不妨在程序中增加提示,请看下面的代码:

#include <stdio.h>
#include <stdlib.h>
int main(){#ifdef _DEBUGprintf("正在使用 Debug 模式编译程序...\n");#elseprintf("正在使用 Release 模式编译程序...\n");#endifsystem("pause");return 0;
}

当以 Debug 模式编译程序时,宏 _DEBUG 会被定义,预处器会保留第 5 行代码,删除第 7 行代码。反之会删除第 5 行,保留第 7 行。

#ifndef 的用法

#ifndef 用法的一般格式为:

#ifndef 宏名程序段1 
#else 程序段2 
#endif

与 #ifdef 相比,仅仅是将 #ifdef 改为了 #ifndef。它的意思是,如果当前的宏未被定义,则对“程序段1”进行编译,否则对“程序段2”进行编译,这与 #ifdef 的功能正好相反。

三者之间的区别

最后需要注意的是,#if 后面跟的是“整型常量表达式”,而 #ifdef 和 #ifndef 后面跟的只能是一个宏名,不能是其他的

例如,下面的形式只能用于 #if:

#include <stdio.h>
#define NUM 10
int main(){#if NUM == 10 || NUM == 20printf("NUM: %d\n", NUM);#elseprintf("NUM Error\n");#endifreturn 0;
}

运行结果:

NUM: 10

再如,两个宏都存在时编译代码A,否则编译代码B:

#include <stdio.h>
#define NUM1 10
#define NUM2 20
int main(){#if (defined NUM1 && defined NUM2)//代码Aprintf("NUM1: %d, NUM2: %d\n", NUM1, NUM2);#else//代码Bprintf("Error\n");#endifreturn 0;
}

运行结果:

NUM1: 10, NUM2: 20

#ifdef 可以认为是 #if defined 的缩写。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/565034.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python实例 85,86

目录 85.题目&#xff1a;输入一个奇数&#xff0c;然后判断最少几个 9 除于该数的结果为整数 86.题目&#xff1a;两个字符串连接程序 85.题目&#xff1a;输入一个奇数&#xff0c;然后判断最少几个 9 除于该数的结果为整数 程序分析&#xff1a;999999 / 13 76923 #85 a…

Python安装与环境变量的配置

Python安装与环境变量的配置 python下载&#xff1a; Python安装包下载地址 1 . 选择Windows系统的 2 . 选择相应的32/64位版本点击下载 python安装&#xff1a; 1 . 下载完成后&#xff0c;使用管理员身份进行安装 注意&#xff0c;勾选“Add Python 3.6 to PATH”选项…

python实例 87,88

目录 87.题目&#xff1a;回答结果&#xff08;结构体变量传递&#xff09; 88.题目&#xff1a;读取7个数&#xff08;1—50&#xff09;的整数值&#xff0c;每读取一个值&#xff0c;程序打印出该值个数的&#xff0a; 87.题目&#xff1a;回答结果&#xff08;结构体变量…

C语言指针是什么

情景进入 计算机中所有的数据都必须放在内存中&#xff0c;不同类型的数据占用的字节数不一样&#xff0c;例如 int 占用 4 个字节&#xff0c;char 占用 1 个字节。为了正确地访问这些数据&#xff0c;必须为每个字节都编上号码&#xff0c;就像门牌号、身份证号一样&#xf…

python实例 89,90

目录 89.电话数据加密 90.题目&#xff1a;列表的使用实例 89.电话数据加密 题目&#xff1a;某个公司采用公用电话传递数据&#xff0c;数据是四位的整数&#xff0c;在传递过程中是加密的&#xff0c;加密规则如下&#xff1a;每位数字都加上5,然后用和除以10的余数代替该数…

C语言指针变量的定义和使用

指针变量的含义 数据在内存中的地址也称为指针&#xff0c;如果一个变量存储了一份数据的指针&#xff0c;我们就称它为指针变量。 在C语言中&#xff0c;允许用一个变量来存放指针&#xff0c;这种变量称为指针变量。指针变量的值就是某份数据的地址&#xff0c;这样的一份数…

python实例 91,92,93,94

目录 Time 模块 91.时间函数举例1 92.时间函数举例2 93.时间函数举例3 94.时间函数举例4,一个猜数游戏&#xff0c;判断一个人反应快慢 Time 模块 Time 模块包含了以下内置函数&#xff0c;既有时间处理的&#xff0c;也有转换时间格式的&#xff1a; 序号函数及描述1tim…

python实例 95,96

目录 95.字符串日期转换为易读的日期格式 python第三方库 - dateutil 1.简介 2.安装 1&#xff0c;parse  2&#xff0c;rrule 96.计算字符串中子串出现的次数 95.字符串日期转换为易读的日期格式 #95 from dateutil import parser # from dateutil.parser import par…

C语言数组指针

数组&#xff08;Array&#xff09;是一系列具有相同类型的数据的集合&#xff0c;每一份数据叫做一个数组元素&#xff08;Element&#xff09;。数组中的所有元素在内存中是连续排列的&#xff0c;整个数组占用的是一块内存。以int arr[] { 99, 15, 100, 888, 252 };为例&am…

python实例 97,98

目录 97.从键盘输入一些字符&#xff0c;逐个把它们写到磁盘文件上&#xff0c;直到输入一个 # 为止 98.从键盘输入一个字符串&#xff0c;将小写字母全部转换成大写字母&#xff0c;然后输出到一个磁盘文件"test"中保存 97.从键盘输入一些字符&#xff0c;逐个把它…

Pycharm最新版本安装教程

下载安装 下载 pycharm官网 等待下载完成。 安装 下载好的exe&#xff0c;得到如下图所示&#xff0c;点击next 选择我们的安装位置&#xff0c;点击Next 把选框都勾选上&#xff0c;点击下一步 继续点击install 等待进度条加载完成&#xff0c;点击Next 如下图所示&…

python实例 99,100

目录 99.有两个磁盘文件A和B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列), 输出到一个新文件C中 100.列表转换为字典 99.有两个磁盘文件A和B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列), 输出到一个新文件C中 #99 import string fp o…

【蓝桥杯每日一练】 汉诺塔

目录 1.说明 2.解法 3.python实现 python全局变量使用方式&#xff1a; python全局变量和局部变量的区别&#xff1a; 1.说明 河内之塔(Towers of Hanoi)是法国人M.Claus(Lucas)于1883年从泰国带至法国的&#xff0c;河内为越战时北越的首都&#xff0c;即现在的胡志明市&…

XPath详解教程

目录 1. XPath 概览 2. XPath 常用规则 3. 准备工作 4.实例引入 5.所有节点 6. 子节点 7.父节点 8.属性匹配 9.文本获取 10.属性获取 11.属性多值匹配 12. 多属性匹配 13.按序选择 14. 节点轴选择 结语 1. XPath 概览 XPath 全称 XML Path Language &#xff0c;即 XML 路径语言…

【蓝桥杯每日一练】 斐波那契数列

目录 1.说明 2.原理 3.python实现 第一种&#xff1a; 第二种&#xff1a; 第三种 第四种 1.说明 Fibonacci为1200年代的欧洲数学家&#xff0c;在他的着作中曾经提到&#xff1a;「若有一只免子每个月生一只小免子&#xff0c;一个月后小免子也开始生产。起初只有一只免…

C语言二级指针

指针可以指向一份普通类型的数据&#xff0c;例如 int、double、char 等&#xff0c;也可以指向一份指针类型的数据&#xff0c;例如 int *、double *、char * 等。 如果一个指针指向的是另外一个指针&#xff0c;我们就称它为二级指针&#xff0c;或者指向指针的指针。 假设…

R 安装详解

目录 1.R软件 的下载 1.1 R下载 1.2 RStudio下载 2.辅助软件 notepad 3.R 扩展软件包的安装与管理 4.基本 R 软件的用法 1.基本运行 2.项目目录 5.RStudio 软件 1.介绍 2.项目 3.帮助 4.使用历史命令 5.放大显示某一窗格 6.运行程序 7.中文编码问题 8.Rmd 文件 …

R 基础入门(1)

目录 一、四则运算 练习&#xff1a; 二、数学函数 1.数学函数——平方根、指数、对数 2.数学函数——取整 3.数学函数——三角函数 4.数学函数——反三角函数 5.分布函数和分位数函数 三、输出 1.简单输出 2.用 sink() 函数作运行记录 练习 四、向量计算与变量赋值…

C语言二维数组指针

二维数组在概念上是二维的&#xff0c;有行和列&#xff0c;但在内存中所有的数组元素都是连续排列的&#xff0c;它们之间没有“缝隙”。 以二维数组 a 为例&#xff1a; int a[3][4] { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} };从概念上理解&#xff0c;a 的分布像一…

R 基础入门(2)

目录 一、绘图 1.曲线图 curve() 函数 2.加参考线 abline() 3.条形图 barplot() 4.散点图 plot() 练习&#xff1a; 二、读取csv文件 1.表格数据 2.读入表格数据 3.分类变量频数统计 4.数值型变量的统计 三、调用自定义函数 一、绘图 1.曲线图 curve() 函数 用 …