C语言当中的#ifdef DEBUG, #define ,#else,#endif等的意义

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言当中的#ifdef DEBUG, #define ,#else,#endif等的意义相关的知识,希望对你有一定的参考价值。

在一个头文件当中有如下语句:
/* Exported macro ------------------------------------------------------------*/
#ifdef DEBUG
/*******************************************************************************
* Macro Name : assert_param
* Description : The assert_param macro is used for function's parameters check.
* It is used only if the library is compiled in DEBUG mode.
* Input : - expr: If expr is false, it calls assert_failed function
* which reports the name of the source file and the source
* line number of the call that failed.
* If expr is true, it returns no value.
* Return : None
*******************************************************************************/
#define assert_param(expr) ((expr) ? (void)0 : assert_failed((u8 *)__FILE__, __LINE__))
/* Exported functions ------------------------------------------------------- */
void assert_failed(u8* file, u32 line);
#else
#define assert_param(expr) ((void)0)
#endif /* DEBUG */

#endif /* __STM32F10x_CONF_H */
这上面的这么一段话是什么意思?以及这些东西如何使用?谢谢.

1、#define 是宏定义

1.1宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的代换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查。如有错误,只能在编译已被宏展开后的源程序时发现。宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换。宏定义其作用域为宏定义命令起到源程序结束。如要终止其作用域可使用#undef命令。
1.2如 define int MAX;
那么你在写程序时:MAX i; 就和int i; 完全一样;因为编译预处理器会把所有的MAX替换成int。优点:有利于程序阅读和修改,自己可以仔细体会。
2、#ifdef 一看意思就是个条件判断语句。等于 #if define( 标识符1)
#ifdef 标识符
程序段1
#else
程序段2
#endif
它的功能是,如果标识符已被#define 命令定义过则对程序段1 进行编译;否则对程序段2进行编译。如果没有程序段2(它为空),本格式中的#else 可以没有,即可以写为:
#ifdef 标识符
程序段
#endif
第二种形式:
#ifndef 标识符
程序段1
#else
程序段2
#endif
与第一种形式的区别是将“ifdef”改为“ifndef”。它的功能是,如果标识符未被#define 命令定义过则对程序段1 进行编译,否则对程序段2 进行编译。这与第一种形式的功能正相反。
第三种形式:
#if 常量表达式
程序段1
#else
程序段2
#endif
它的功能是,如常量表达式的值为真(非0),则对程序段1 进行编译,否则对程序段2 进行编译。因此可以使程序在不同条件下,完成不同的功能。
至于#elif 命令意义与else if 相同,它形成一个if else-if 阶梯状语句,可进行多种编译选择。
参考技术A #ifdef DEBUG
是判断 DEBUG头文件是否已经存在,ifdef(if define)
存在就执行
#define assert_param(expr) ((expr) ? (void)0 : assert_failed((u8 *)__FILE__, __LINE__))
/* Exported functions ------------------------------------------------------- */
void assert_failed(u8* file, u32 line);
返回失败并找到在哪里定义了,

否则执行
#define assert_param(expr) ((void)0)本回答被提问者采纳
参考技术B 这些是预编译开关的使用

#ifdef YOUR_FLAG
/*part1*/
#else
/*part2*/
#endif

根据YOUR_FLAG的是否已经宏定义,来执行不同的设置。如果已经定义了YOUR_FLAG,则使用并编译part1部分,否则使用part2部分。

像你这里,要使用实际有功能的使用assert_param,则需要在在这个头文件之前加上:
#define DEBUG
然后还需要自己编写void assert_failed(u8* file, u32 line);的定义体。
如果不需要使用实际意义的assert_param,则不需要使用#define DEBUG,如果其他地方有了这个宏定义,你也得删掉或注释掉。

一般的,
if(condition) do_something1;
else do_something2;
这些是编译过程中会把程序转换成汇编语句和二进制执行语句。
而#ifdef FLAG
#else
#endif
是在编译之前的预编译阶段完成的(可能有些编译器没预编译的功能,那就在编译阶段完成)。
参考技术C 这些是预编译开关的使用

#ifdef YOUR_FLAG
/*part1*/
#else
/*part2*/
#endif

根据YOUR_FLAG的是否已经宏定义,来执行不同的设置。如果已经定义了YOUR_FLAG,则使用并编译part1部分,否则使用part2部分。

像你这里,要使用实际有功能的使用assert_param,则需要在在这个头文件之前加上:
#define DEBUG
然后还需要自己编写void assert_failed(u8* file, u32 line);的定义体。
如果不需要使用实际意义的assert_param,则不需要使用#define DEBUG,如果其他地方有了这个宏定义,你也得删掉或注释掉。

一般的,
if(condition) do_something1;
else do_something2;
这些是编译过程中会把程序转换成汇编语句和二进制执行语句。
而#ifdef FLAG
#else
#endif
是在编译之前的预编译阶段完成的(可能有些编译器没预编译的功能,那就在编译阶段完成)。

以上是关于C语言当中的#ifdef DEBUG, #define ,#else,#endif等的意义的主要内容,如果未能解决你的问题,请参考以下文章

C++中#if #ifdef 的作用

windows创建虚拟通道

#ifdef __cplusplus 的用法(C语言调用c++代码)

#ifdef _DEBUG 在 vs 2008 中的发布模式

C语言中#if,#if defined ,#ifdef,extern的用法描述

#ifdef __cplusplus