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

相关文章

nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析(结合应用场景)

《nginx-t、nginx-sstop和nginx-sreload命令的详细解析(结合应用场景)》本文解析Nginx的-t、-sstop、-sreload命令,分别用于配置语法检... 以下是关于 nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析,结合实际应

C#连接SQL server数据库命令的基本步骤

《C#连接SQLserver数据库命令的基本步骤》文章讲解了连接SQLServer数据库的步骤,包括引入命名空间、构建连接字符串、使用SqlConnection和SqlCommand执行SQL操作,... 目录建议配合使用:如何下载和安装SQL server数据库-CSDN博客1. 引入必要的命名空间2.

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

Linux系统性能检测命令详解

《Linux系统性能检测命令详解》本文介绍了Linux系统常用的监控命令(如top、vmstat、iostat、htop等)及其参数功能,涵盖进程状态、内存使用、磁盘I/O、系统负载等多维度资源监控,... 目录toppsuptimevmstatIOStatiotopslabtophtopdstatnmon

zookeeper端口说明及介绍

《zookeeper端口说明及介绍》:本文主要介绍zookeeper端口说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、zookeeper有三个端口(可以修改)aVNMqvZ二、3个端口的作用三、部署时注意总China编程结一、zookeeper有三个端口(可以

PowerShell中15个提升运维效率关键命令实战指南

《PowerShell中15个提升运维效率关键命令实战指南》作为网络安全专业人员的必备技能,PowerShell在系统管理、日志分析、威胁检测和自动化响应方面展现出强大能力,下面我们就来看看15个提升... 目录一、PowerShell在网络安全中的战略价值二、网络安全关键场景命令实战1. 系统安全基线核查

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

Python中win32包的安装及常见用途介绍

《Python中win32包的安装及常见用途介绍》在Windows环境下,PythonWin32模块通常随Python安装包一起安装,:本文主要介绍Python中win32包的安装及常见用途的相关... 目录前言主要组件安装方法常见用途1. 操作Windows注册表2. 操作Windows服务3. 窗口操作

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的