在C/C++的案例中经常使用的Debug技巧之一,就是使用前处理器 #define #ifdef #endif 来夹住Debug程式码。
程序开发阶段大量详细的捕捉可能出问題的情形并输出Debug信息或中断是非常重要的,但是这些处理”几乎不会发生的情形”的程式码当然会影响程序效能。
使用#ifdef就可以直接在编译时决定要生成release版本或是debug版本,非常的方便。
简单介绍一下c中是怎么用的。
一般情况下,源程序中所有的行都参加编译。但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”。有时,希望当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。
拿debug举例:
#ifdef DEBUG
print ("device_open(%p)\n", file);
#endif
如果在它的前面有以下命令行:
#define DEBUG
则在程序运行时输出file指针的值,以便调试分析。调试完成后只需将这个define命令行删除即可。有人可能觉得不用条件编译也可达此目的,即在调试时加一批printf语句,调试后一一将printf语句删除去。的确,这是可以的。但是,当调试时加的printf语句比较多时,修改的工作量是很大的。用条件编译,则不必一一删改printf语句,只需删除前面的一条“#define DEBUG”命令即可,这时所有的用DEBUG作标识符的条件编译段都使其中的printf语句不起作用,即起统一控制的作用,如同一个“开关”一样。
Java这种常用在大型案例的语言沒有类似的功能,不过要模仿#ifdef的功能是可以的。简单说,Java 编译器为了最佳化,只要发现条件式的值为false,编译时就会把该区段代码忽略。所以只要定有一个 public final boolean 变量就可以了。例如:
public interface Debug
{
public final boolean ENABLE = true;
}
public class Hello
{
if(Debug.ENABLE)
{
System.out.println("This is debug message.");
}
}
分享到:
相关推荐
在C/C++编程中,预编译指令是代码编译过程中的重要组成部分,它们主要用于处理源代码中的条件编译和宏定义。`#define`, `#ifdef`, `#endif`等预编译指令帮助程序员根据特定条件来决定哪些代码应该被编译,从而实现...
#ifdef、#else、#endif 和#ifndef 是 C/C++ 预处理命令中条件编译的四个基本指令,它们可以帮助开发者在编译前对代码进行选择性编译,从而实现代码的灵活使用和高效编译。 #ifdef 指令的用法 #ifdef 指令用来检测...
#ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif 已测试,能正常运行。 //地图状态 #define MAP_BACKGROUP 48 //'0' 对应字符'0'背景 #define MAP_WHITEWALL 49 /...
// #define DEBUG(VAR) mylog.Print(__FILE__, __LINE__, VAR, LOG_DEBUG) // // #else // // #define DEBUG(VAR) function //项目用的标准的日志函数. // // #endif // // // //Plan :1.0版本写成可以带参数的日志...
在C/C++编程语言中,`#define` 是预处理器指令,用于创建宏定义,它在编译阶段执行文本替换,使得代码更加灵活且可定制化。宏定义是C/C++编程中的一个重要概念,它可以帮助程序员实现代码复用、简化复杂表达式、提供...
`#define`宏定义是C/C++编程中不可或缺的一部分,它提供了多种灵活的方式来增强代码的功能性与可维护性。通过对本文介绍的各种宏定义技巧的学习与应用,开发者能够编写出更加高效、易维护的代码。然而,由于宏的特殊...
C语言中条件编译相关的预编译指令 C语言中条件编译是根据实际定义宏(某类条件)进行代码静态编译的手段。可根据表达式的值或某个特定宏是否被定义来确定编译条件。下面将详细介绍条件编译中使用的预编译指令。 一...
在 C/C++ 编程中,`ifndef` 和 `endif` 通常与 `ifdef` 结合使用,以实现头文件的正确引用。当一个头文件可能被多个源文件多次包含时,如果不加以处理,可能会导致变量或函数声明重复的问题。因此,通过在头文件中...
在C/C++编程语言中,宏定义是一种非常实用的功能,它允许程序员定义一系列文本替换规则,这些规则可以在编译前由预处理器处理。宏定义不仅可以简化代码编写过程,提高代码可读性和可维护性,还能在一定程度上增强...
然而,尽管`#define`在早期的C++和C语言中广泛使用,但在现代C++中,推荐使用更安全的`const`和`enum`来代替,以避免某些潜在问题。 **1. 定义符号常量** 符号常量是一个固定不变的值,它在程序的整个生命周期中...
商品销售管理系统C++ SQL2000. #include "stdafx.h" // Standard windows header file #include "BCMenu.h" // BCMenu class declaration #include <afxpriv.h> //SK: makes A2W and other spiffy AFX macros work ...
# define TT_DEBUG printf("<%s:%d>", __func__, __LINE__),printf # else # define TT_DEBUG # endif //__TIME_TRACE_INER_DEBUG__ #else // __TIME_TRACE_DEBUG__ # define TIME_TRACE_RESET # define ...
在 C/C++ 开发环境中,动态链接库(Dynamic Link Library,简称 DLL)是非常重要的一个组成部分,它允许开发者将代码分割成不同的模块来提高程序的可维护性和重用性。本文将详细介绍在 C/C++ 中设计与调用 DLL 的...
预编译是C/C++语言中的一项重要特性,它主要用于程序开发过程中的优化和代码管理。通过预编译,开发者可以在编译前对源代码进行一系列处理,如宏定义、条件编译等,以达到代码复用、简化维护以及性能优化的目的。 #...
#define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CChildFrame IMPLEMENT_DYNCREATE...
#ifdef _DEBUG FILEFLAGS 0x1L #else FILEFLAGS 0x0L #endif FILEOS 0x40004L FILETYPE 0x1L FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "080404b0" BEGIN VALUE "CompanyName", "DS小龙哥...
这种方法利用C/C++预处理器特性`#define`来定义一个或多个调试标记,并通过条件编译指令`#ifdef`和`#endif`对这些标记进行管理。 **示例代码:** ```cpp #define DEBUG #ifdef DEBUG // 调试代码 #endif ``` **...
JNI在Android开发中尤其重要,因为这使得开发者可以在性能要求较高的场景下使用C或C++来编写程序,并通过JNI与Java层进行通信。 #### 二、JNI编写步骤 ##### 1. 创建JNI接口 在Java层定义一个类,并声明native...
代码如下:#include “stdafx.h” #include<stdlib> #include<crtdbg> #include <iostream> // 内存泄露检测机制 #define _CRTDBG_MAP_ALLOC #ifdef _DEBUG #define new new(_NORMAL_BLOCK, __FILE_
最近在看《Linux C编程一站式学习》这本书,就想到一个方法: 代码如下:void myprintf(char* fmt, …){}#ifdef DEBUG#define printf(fmt, args…) myprintf(fmt, ##args)#endif调试阶段带着DEBUG调试,正式上线就...