c语言#if,#ifndef,#define,#ifdef,#endif等预处理命令介绍

2024-01-24 00:20

本文主要是介绍c语言#if,#ifndef,#define,#ifdef,#endif等预处理命令介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

#if介绍

#if 是条件编译,使用方式和if else的使用非常相似, 一般使用格式如下:

#if 整形常量表达式1
程序段1
#elif 整形常量表达式2
程序段2
#else
程序段3
#endif

执行起来就是,如果整形常量表达式为真,则执行程序段1,否则继续往后判断依次类推(注意是整形常量表达式),最后#endif是#if的结束标志

#include "stdio.h"#define MAX 10
int main()
{printf("MAX = %d\n", MAX);
#if    MAX == 10printf("MAX已被定义\n");
#elseprintf("MAX未被定义\n");#undef MAX#define    MAX 20
#endifprintf("MAX = %d\n", MAX)return 0;
}

运行结果为:
在这里插入图片描述

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

#define介绍

最常见的用法

#define N 100

编译器在预处理程序的时候,会将程序中所有N替换成100.换言之,不同于const常量,define其实本质是上对文本内容的替换。

#define和constant的区别:

  1. define是宏定义,程序在预处理阶段将用define定义的内容进行了替换 。因此在程序运行时,常量表中并没有用define定义的常量,系统不为它分配内存。而const定义的常量,在程序运行时,存在常量表中,且系统为它分配内存。
  2. define定义的常量,预处理时只是直接进行了替换,因此在编译时不能进行数据类型检验。而const定义的常量,在编译时进行严格的类型检验,可以避免出错。
  3. define定义表达式时要注意“边缘效应”。
#define N 1+2 
float a = N/2.0;

常规思维可能会觉得a的结果为1.5(3/2)
但实际的结果为1+2/2.0 = 1+1.0=2.0
如果想要结果为1.5则需要这样子:

#define N (1+2)
float a = N/2.0;

定义函数

#include<stdio.h>
#define PI 3.14
#define S(r) PI*r*r
int main(void)
{printf("area = %f", S(1+2));rerturn 0;
}

打印的结果为7.14
因为 3.14 * 1+2 * 1+2 = 3.14+2+2 = 7.14

注意#define 就是一个简单而直接的文本替换,将后面的内容直接替换进去就行.
但并不是所有情况下#define所定义的字符串都会被替换,有一种特殊情况:被替换的字符串在""内

#include <stdio.h>#define MAX 10int main()
{printf("MAX");
}

这里的MAX就不会被替换

取消定义

宏定义是#define,如果想要取消宏定义,可以使用#undef

#ifdef介绍

#ifdef的作用是判断某个宏是否定义,如果已经定义则执行后面的代码,使用格式如下:

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

它的意思是,如果该宏已被定义过,则对程序段1进行编译,否则对程序段2进行编译(这个和上面的#if一样最后都需要#endif),上述格式也可以不用#else,这一点上和if else相同
例如:

#include <stdio.h>
#define MAX 10
int main()
{
#ifdef MAXprintf("MAX已被定义\n");
#elseprintf("MAX未被定义\n");#undef MAX#define    MAX 20
#endifprintf("MAX = %d\n", MAX);return 0;
}

#ifndef和#ifdef的使用完全相反,当宏未被定义才会执行后面的程序段.
不管是#if,#ifdef还是#ifndef,最后一定要是#endif结尾

这篇关于c语言#if,#ifndef,#define,#ifdef,#endif等预处理命令介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/637996

相关文章

Python进阶之Excel基本操作介绍

《Python进阶之Excel基本操作介绍》在现实中,很多工作都需要与数据打交道,Excel作为常用的数据处理工具,一直备受人们的青睐,本文主要为大家介绍了一些Python中Excel的基本操作,希望... 目录概述写入使用 xlwt使用 XlsxWriter读取修改概述在现实中,很多工作都需要与数据打交

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.

Go语言实现将中文转化为拼音功能

《Go语言实现将中文转化为拼音功能》这篇文章主要为大家详细介绍了Go语言中如何实现将中文转化为拼音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 有这么一个需求:新用户入职 创建一系列账号比较麻烦,打算通过接口传入姓名进行初始化。想把姓名转化成拼音。因为有些账号即需要中文也需要英

关于Maven生命周期相关命令演示

《关于Maven生命周期相关命令演示》Maven的生命周期分为Clean、Default和Site三个主要阶段,每个阶段包含多个关键步骤,如清理、编译、测试、打包等,通过执行相应的Maven命令,可以... 目录1. Maven 生命周期概述1.1 Clean Lifecycle1.2 Default Li

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

windows系统下shutdown重启关机命令超详细教程

《windows系统下shutdown重启关机命令超详细教程》shutdown命令是一个强大的工具,允许你通过命令行快速完成关机、重启或注销操作,本文将为你详细解析shutdown命令的使用方法,并提... 目录一、shutdown 命令简介二、shutdown 命令的基本用法三、远程关机与重启四、实际应用

Python实现NLP的完整流程介绍

《Python实现NLP的完整流程介绍》这篇文章主要为大家详细介绍了Python实现NLP的完整流程,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 编程安装和导入必要的库2. 文本数据准备3. 文本预处理3.1 小写化3.2 分词(Tokenizatio