C语言的宏定义 #if defined 的作用

一、#if defined的作用
我们要检查a是否定义

#if defined a
#undef a
#define a 200
#endif

#ifndef a //如果a没有被定义
#define a 100
#endif

#undef为解除定义

#ifndef是if not defined的缩写,即如果没有定义

上述语句检验a是否被定义,如果被定义,则用#undef语句解除定义,并重新定义a为200

二、#if ! defined 的作用

#if defined XXX_XXX
#endif
是条件编译,是根据你是否定义了XXX_XXX这个宏,而使用不同的代码。一般.h文件里最外层的
#if !defined XXX_XXX
#define XXX_XXX
#endif
是为了防止这个.h头文件被重复include

#ifdef的使用和#if defined()的用法一致
#ifndef又和#if !defined()的用法一致。

三、指令 用途

# 空指令,无任何效果
#include 包含一个源代码文件
#define 定义宏
#undef 取消已定义的宏
#if 如果给定条件为真,则编译下面代码
#ifdef 如果宏已经定义,则编译下面代码
#ifndef 如果宏没有定义,则编译下面代码
#elif 如果前面的#if给定条件不为真,当前条件为真,则编译下面代码
#endif 结束一个#if……#else条件编译块
#error 停止编译并显示错误信息

 

四、相等判断

有没有办法检查宏中的数字相等性?

我想做点什么

#define choice 3 #if choice == 3 .... #endif #if choice == 4 ... #endif 

C宏是否支持这样的事情?

确实应该有效。 见http://gcc.gnu.org/onlinedocs/cpp/If.html#If

该引用是准确的,但以“标准格式”编写:抽象地没有示例。

编写代码的另一种方法是使用链式#elif指令:

 #if choice == 3 ... #elif choice == 4 ... #else #error Unsupported choice setting #endif 

请注意,如果choice不是#defined ,则预处理器会将其视为值为0 。

据我所知,应该工作。 你用的是什么编译器?

PS:仅供参考,定义名称通常用大写字母书写!

#define CHOICE 3

 

五、多条件判断

1.“与”判断 (即判断多个宏是否同时定义)

#if defined(WIN32) && !defined(__LWIP_OPT_H__) && !defined(LWIP_HDR_OPT_H)
#endif /* curl_socket_typedef */

2.“或”判断(即判断多个宏是否有其中一个定义)

#if defined(_AIX) || defined(__NOVELL_LIBC__) || defined(__NetBSD__) || \
    defined(__minix) || defined(__SYMBIAN32__) || defined(__INTEGRITY) || \
    defined(ANDROID) || defined(__ANDROID__) || defined(__OpenBSD__) || \
   (defined(__FreeBSD_version) && (__FreeBSD_version < 800000))
#include <sys/select.h>
#endif

2.“非”判断(即判断多个宏是否同时都没有定义)

#if !defined(WIN32) && !defined(__WATCOMC__) && !defined(__VXWORKS__)
#include <sys/time.h>
#endif
posted @ 2023-07-20 09:16  HelloMarsMan  阅读(5560)  评论(0)    收藏  举报