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使用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.函数返回的

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

c++中的set容器介绍及操作大全

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录​​一、核心特性​​️ ​​二、基本操作​​​​1. 初始化与赋值​​​​2. 增删查操作​​​​3. 遍历方

postgresql数据库基本操作及命令详解

《postgresql数据库基本操作及命令详解》本文介绍了PostgreSQL数据库的基础操作,包括连接、创建、查看数据库,表的增删改查、索引管理、备份恢复及退出命令,适用于数据库管理和开发实践,感兴... 目录1. 连接 PostgreSQL 数据库2. 创建数据库3. 查看当前数据库4. 查看所有数据库

Go语言代码格式化的技巧分享

《Go语言代码格式化的技巧分享》在Go语言的开发过程中,代码格式化是一个看似细微却至关重要的环节,良好的代码格式化不仅能提升代码的可读性,还能促进团队协作,减少因代码风格差异引发的问题,Go在代码格式... 目录一、Go 语言代码格式化的重要性二、Go 语言代码格式化工具:gofmt 与 go fmt(一)

linux重启命令有哪些? 7个实用的Linux系统重启命令汇总

《linux重启命令有哪些?7个实用的Linux系统重启命令汇总》Linux系统提供了多种重启命令,常用的包括shutdown-r、reboot、init6等,不同命令适用于不同场景,本文将详细... 在管理和维护 linux 服务器时,完成系统更新、故障排查或日常维护后,重启系统往往是必不可少的步骤。本文

HTML img标签和超链接标签详细介绍

《HTMLimg标签和超链接标签详细介绍》:本文主要介绍了HTML中img标签的使用,包括src属性(指定图片路径)、相对/绝对路径区别、alt替代文本、title提示、宽高控制及边框设置等,详细内容请阅读本文,希望能对你有所帮助... 目录img 标签src 属性alt 属性title 属性width/h