参考地址:http://www.cnblogs.com/ezrax/archive/2008/08/06/1262032.html
在看例程的时候,经常看到主函数开始前会有这样的代码,知道是用作调试的。但对此比较模糊,
int main(void)
{
#ifdef DEBUG
debug();
#endif
在工程设置里有一些设置会对该工程自动产生一系列的宏,用以控制程序的编译和运行。如果你把代码夹在#ifdef DEBUG 和对应的 #endif 中间,那么这段代码只有在调试(DEBUG)下才会被编译。也就是说,如果你在RELEASE模式下,这些代码根本就不会存在于你的最终代码里头。
你可以手动实现DEBUG的定义如:
#define DEBUG
这些宏代码本身是面向编译器使用的,不要用来实现你的业务逻辑代码,这样会带来很不好的影响。这类宏定义的一个典型应用就是产生/屏蔽调试信息,看下面的例子
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--> 1 #include <iostream>
2 using namespace std;
3
4 #ifdef DEBUG
5 inline void msg(){ cout<<"I'm testing"; }
6 #else
7 inline void msg() {}
8 #endif
9
10 int main()
11 {
12 msg();
13
14 return 0;
15 }
上面的代码在DEBUG 模式下是会输出一句话的,你可以把这种应用放在你希望对程序的执行过程进行跟踪的代码里,为它们加上一些‘痕迹’,方便你进行判断。而在其他模式(RELEASE)下,这个函数只不过是一个空函数,又因为它是inline的,所以它实际上不会为你产生任何代码。这样你就能为自己的代码带来一种非常实用的效果,既能在DEBUG模式下为你提供判断的依据,又能在最终的RELEASE版中方便的抛弃掉它们,而不需要你手动地删除掉那些代码。
作为宏指令,如果定义了DEBUG宏那么编译#IF后面到#ENDIF的代码否则不编译DEBUG宏一般是编译器产生,如果编译模式是DEBUG就会产生这个宏,如果是RELEASE就不会
分享到:
相关推荐
"#ifdef,#else,#endif和#ifndef的用法" #ifdef、#else、#endif 和#ifndef 是 C/C++ 预处理命令中条件编译的四个基本指令,它们可以帮助开发者在编译前对代码进行选择性编译,从而实现代码的灵活使用和高效编译。 #...
`#define`, `#ifdef`, `#endif`等预编译指令帮助程序员根据特定条件来决定哪些代码应该被编译,从而实现代码的灵活性和可配置性。 `#define`是宏定义指令,用于创建一个符号常量。例如,`#define DEBUG`将DEBUG定义...
#ifdef DEBUG cout()"; #endif return 0; } ``` 运行结果为:Beginning execution of main() #ifdef 指示符还可以用于条件编译,即根据不同条件编译不同的代码。例如,编写一个既可用 TC 编译又可用 VC 编译的...
#ifdef DEBUG printf("device_open(%p)", file); #endif ``` 当`#define DEBUG`存在时,程序将输出调试信息;当不再需要调试时,只需删除或注释掉`#define DEBUG`即可。 #### 更多示例 ##### 字母转换 下面的例子...
#ifdef DEBUG print ("device_open(%p)\n", file); #endif ``` 这样,只需要定义 DEBUG 标识符,即可输出调试信息。 条件编译是C语言中的一种非常有用的技术,可以提高程序的通用性和灵活性。
#ifdef DEBUG printf("device_open(%p)\n", file); #endif ``` 在开发阶段,可以通过定义 `DEBUG` 来启用调试信息输出;调试完成后,只需要取消定义 `DEBUG` 即可关闭所有相关的调试输出,无需手动删除每一条 `...
本文将详细介绍`#ifdef`...`#endif`的定义、语法结构以及具体的使用场景,帮助读者更好地理解和掌握这一特性。 #### 二、`#ifdef`...`#endif`条件编译指令的定义 `#ifdef`...`#endif`是C语言预处理器提供的条件...
#ifdef DEBUG #import "TXFPSCalculator.h" #endif STEP 2: - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [self.window makeKeyAndVisible...
#ifdef DEBUG print("device_open(%p)\n", file); #endif ``` 这样,在调试时,可以输出调试信息,而在调试完成后,不再输出这些信息。 #ifndef、#def、#endif等宏是C语言预处理命令中的重要组成部分,它们在条件...
#ifdef DEBUG cout()"; #endif ``` 如果定义了宏DEBUG,则输出“Beginning execution of main()”;否则什么也不输出。 条件编译的命令形式通常为: ```c #ifdef 标识符 程序段 1 #else 程序段 2 #endif ``` 它的...
#ifdef DEBUG debug(); #endif /*Core initialization*/ /*NVIC first,before RCC initialization,use HSI,because RCC initialization also may have INT,GPIO last*/ NVIC_Configuration(); RCC_...
在C语言中,`#ifndef`、`#define`、`#endif`等宏是预处理器指令,它们用于实现条件编译,这是一种根据特定条件决定是否编译代码块的机制。预处理器是编译过程的第一步,它在实际编译之前处理源代码,主要任务之一...
ifdef宏的基本语法为:#ifdef标识符程序段1#else程序段2#endif。其作用是:当标识符已经被定义时,对程序段1进行编译,否则编译程序段2。这种宏可以用来在不同的平台或环境下编译不同的代码。 例如,在Windows平台...
#ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #define BCMENU_GAP 1 #ifndef OBM_CHECK #define OBM_CHECK 32760 // from winuser.h #endif #if _MFC_VER ...
在这种情况下,你需要在`#ifdef DEBUG`后的所有相关代码之后添加`#endif`,以指示编译器条件语句的结束。修复后,调试信息只会在DEBUG宏被定义时打印。 理解并正确处理这些编译错误是编写高效、无bug的C程序的关键...
#ifdef _DEBUG #pragma comment(lib,"libcurld.lib") #else #pragma comment(lib,"libcurl.lib") #endif #pragma comment ( lib, "ws2_32.lib" ) #pragma comment ( lib, "winmm.lib" ) #pragma comment ( lib, ...
#endif 命令是#if, #ifdef, #ifndef 这些条件命令的结束标志。 9. defined defined 命令用来测试某个宏是否被定义。defined(name): 若宏名被定义,则返回 true。 例如: ```c #if defined(_DEBUG) // ... #endif...
ifdef-loader Webpack加载器,可直接从Webpack进行JavaScript或TypeScript条件编译( #if ... #elif ... #else ... #endif )。 有条件的编译指令写在///三斜杠注释中,这样它们就不会影响普通JavaScript或...
在 C/C++ 编程中,`ifndef` 和 `endif` 通常与 `ifdef` 结合使用,以实现头文件的正确引用。当一个头文件可能被多个源文件多次包含时,如果不加以处理,可能会导致变量或函数声明重复的问题。因此,通过在头文件中...