#if 和#ifdef的区别
转自:https://blog.csdn.net/zhangchiytu/article/details/7563329
先看个例子:
#define TARGET_LITTLE_ENDINA 1
#define TARGET_BIG_ENDINA 0
#ifdef TARGET_LITTLE_ENDINA
call little endina function
#else
call big endina function
#endif
不管把 TARGET_LITTLE_ENDINA 和 TARGET_BIG_ENDINA定义成0或者1,甚至后面不写这个0或者1 ,调用的都是little endina函数,这段代码是有问题的,就是没有理解#if和#ifdef之间的区别。
#if 的使用说明
#if的后面接的是表达式,如果表达式为1,则编译#if下面的代码
1 #if (MAX==10)||(MAX==20) 2 ...code... 3 #endif
它的作用是:如果(MAX==10)||(MAX==20)成立,那么编译器就会把其中的#if 与 #endif之间的代码编译进去(注意:是编译进去,不是执行!!)
#ifdef 的说明
#ifdef 后面接的是一个宏
1 #ifdef (x) 2 ...code... 3 #endif
这个#ifdef 它不管里面的“x”的逻辑是“真”还是“假”,它只管这个程序前面的宏定义里面有没有定义“x”这个宏(即在这里#define x 1和#define x 0等效,都等同于#define x)。
如果定义了x这个宏,那么编译器会编译中间的…code…否则直接忽视中间的…code…代码。
#if defined的使用
#if defined() 的使用和#ifdef的用法一致
#if !defined()又和 #ifndef 的用法一致。
最后强调两点:
第一:这几个宏定义只是决定代码块是否被编译!
第二:别忘了#endif
#ifdef 的用法
灵活使用#ifdef指示符,我们可以区隔一些与特定头文件、程序库和其他文件版本有关的代码。define.cpp文件:
1 #include "iostream.h" 2 int main() 3 { 4 #ifdef DEBUG 5 cout<< "Beginning execution of main()"; 6 #endif 7 return 0; 8 }
运行结果:Press any key to continue
改写代码如下:
1 #include "iostream.h" 2 #define DEBUG 3 int main() 4 { 5 #ifdef DEBUG 6 cout<< "Beginning execution of main()"; 7 #endif 8 return 0; 9 }
运行结果为:Beginning execution of main()
Press any key to continue
更一般的情况是,#define语句是包含在一个特定的头文件中。
比如,新建头文件head.h,在文件中加入代码:
1 #ifndef DEBUG 2 #define DEBUG 3 #endif
而在define.cpp源文件中,代码修改如下:
1 #include "iostream.h" 2 #include "head.h" 3 int main() 4 { 5 #ifdef DEBUG 6 cout<< "Beginning execution of main()"; 7 #endif 8 return 0; 9 }
运行结果如下:Beginning execution of main()
Press any key to continue
结论:通过使用#ifdef指示符,我们可以区隔一些与特定头文件、程序库和其他文件版本有关的代码。
================================================================================
为各个版本的软件升级工作是很困难的,因为这些补丁程序都是在一套软件的基础上不断地修改与扩充而编写的,并由不同的标志文件转入到不同的模块,虽然程序 体积在不断扩大,但丝毫不影响老用户的功能,这主要是得益于C程序的#ifdef/#else/#endif的作用。
我们主要使用以下几种方法,假设我们已在程序首部定义#ifdef DEBUG与#ifdef TEST:
1.利用#ifdef/#endif将某程序功能模块包括进去,以向某用户提供该功能。
在程序首部定义#ifdef HNLD:
1 #define HNLD 2 3 #ifdef HNLD 4 #include"n166_hn.c" 5 #endif
如果不许向别的用户提供该功能,则在编译之前将首部的HNLD加一下划线即可。
2.在每一个子程序前加上标记,以便追踪程序的运行。
1 #ifdef DEBUG 2 printf(" Now is in hunan !"); 3 #endif
3.避开硬件的限制。有时一些具体应用环境的硬件不一样,但限于条件,本地缺乏这种设备,于是绕过硬件,直接写出预期结果。具体做法是:
1 #ifndef TEST 2 i=dial(); //程序调试运行时绕过此语句 3 #else 4 i=0; 5 #endif
调试通过后,再屏蔽TEST的定义并重新编译,即可发给用户使用了。
明白了之间的区别问题就变得非常的容易,修改上述代码只要把其中的#ifdef改成#if就可以达到目的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)