C语言中的调试宏

#ifdef DEBUG
#define debug_printf(fmt, ...) printf(fmt, ##__VA_ARGS__)
#else
#define debug_printf(fmt, ...)
#endif

其中##在没有参数的时候去掉前面的","号,否则在没有参数的时候,编译会报错。

#include <stdio.h>

#ifdef DEBUG
#define debug_printf(fmt, ...) printf(fmt, ##__VA_ARGS__)
#else
#define debug_printf(fmt, ...)
#endif

int main(int argc, char *argv[])
{
	char* arr = "liuwei";
	int a = 3;
	debug_printf("hello, %d, %s\n", a, arr);
}
时间: 2024-10-13 20:51:36

C语言中的调试宏的相关文章

关于C语言中的一些宏的小知识

关于C语言中的一些宏的小知识 1.##和# c语言中,##表示把两个宏参数贴合在一起,即,#define call(x,y) x##y ,执行call(x,y)结果为xy,例如,int x=2,y=5;int xy=90;printf("%d\n",call(x,y));//结果为90 ##被称为连接符,用来将两个宏参数连接为一个宏参数.而单个#的功能是将其后面的宏参数进行字符串化操作,简单地说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号,使其成为字符串. 以上引自百度知

R语言中函数调试

有时候会用R语言写一下简单的脚本处理函数,加入需要调试的话可以按照下面的步骤进行: fun <- function(x , y){ x + y x - y x * y x / y } debug(fun) 先创建一个简单的函数,然后用debug() 函数对创建的fun()函数进行debug.这时控制台没有任何变化,但是当再次运行创建函数时会进入debug状态: fun(2 + 3) debugging in: fun(2 + 3) debug at #1: { x + y x - y x * y

C语言中的__LINE__宏

在C语言中,有这么四个预定义的宏: 当前文件: __FILE__ 当前行号: __LINE__ 当前日期: __DATE__ 当前时间: __TIME__ 这4个宏在代码编译的时候,由编译器替换成实际的值或字符串. 下面演示一段代码,编译一个代码: test.c 1 #include <stdio.h> 2 void main() 3 { 4 printf(" %s \n %d \n %s \n %s \n",__FILE__,__LINE__,__DATE__,__TIM

C语言中宏定义使用方法详解

C语言中的宏替换详解 首先看一个问题: #include <stdio.h> #define    PRINT_CLINE()    printf("%d", ______) int main(void) { PRINT_CLINE(); PRINT_CLINE(); return 0; } 在横线处填上适当的代码,使得上面这段代码的输出为34. 我想一般人看到这个问题的时候头脑里都没有明确的思路来解答这个它.我看到这个问题的时候想出了各种办法来解答它,最终还是没有通过编译

简单讲解C语言中宏的定义与使用

宏定义是预编译功能的一种, 预编译又称为预处理, 是为编译做的预备工作的阶段.处理#开头的指令, 比如拷贝 #include 包含的文件代码,#define宏定义的替换,条件编译等. 使用宏定义的好处:使用宏定义的好处:可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改.例如 π 这个常量,我们有时候会在程序的多个地方使用,如果每次使用都重新定义,一来比较麻烦,二来容易出错,所以我们可以把 π 做成宏定义来使用.   语法说明: (1)宏名一般用大写 (2)使用宏可提高程序的通用性

C语言中宏定义(#define)时do{}while(0)的价值(转)

C语言中宏定义(#define)时do{}while(0)的价值 最近在新公司的代码中发现到处用到do{...}while(0),google了一下,发现Stack Overflow上早有很多讨论,总结了一下讨论,加上自己的理解,do{...}while(0)的价值主要体现在: 1. 增加代码的适应性 下面的宏定义没有使用do{...}while(0) #define FOO(x) foo(x); bar(x); 这样宏定义,单独调用不会出现问题,例如: FOO(100) 宏扩展后变成: 1 f

c语言中的宏定义的学习体会

在学习stm32的过程中遇到关于宏定义的问题,所以,写出来大家一起学习一下 问题出处: 其中\是语言中的转义字符,用来连接上下文,因为宏定义只能是一个串,而当你的串过长(超过一行的时候)时,就需要换行了,此时就需要\来连接上下文. 下面是成熟软件中常用到的宏定义: 1,防止一个头文件被重复包含 #ifndef COMDEF_H #define COMDEF_H //头文件内容 #endif 2,重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植. typedef 

sas宏(3)宏,调试宏,创建带参数的宏,理解符号表(全局宏与局部宏解析),宏条件运算符,在宏中进行运算

宏类似于c中的函数,传入指定参数后执行,并且宏内部可以包含data步程序和条件运算符号. 宏变量只是小小的变量....(by the way作用也很大) 1:宏的基本语法 如何创建一个简单的宏并使用? %macro prtlast; proc print data=&syslast (obs=5); title "Listing of &syslast data set"; run; %mend; %prtlast /*不要加分号,加了有可能出错*/ 宏创建过程中做了什

简述C语言中宏的作用及其副作用

引问:写一个"标准"宏MIN,这个宏输入两个参数并返回较小的一个? 答案:#define  MIN(A,B)  ( (A) <= (B)? (A) : (B) ) 知识梳理: 1). 标识#define在宏中应用的基本知识.直到嵌入(inline)操作符变为标准C的一部分,宏是方便产生嵌入代码的唯一方法, 对于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方法. 2). 三重条件操作符的知识.这个操作符存在C语言中的原因是它使得编译器能产生比if-then-else更