C语言中宏的使用(#,##,do…while(0)宏)

1.预定义宏的使用__FILE__,__FUNCTION__,__LINE__。

#include <stdio.h>
void fun(void)
{
	char v1;
	short v2;
	int v3;
	long v4;
	printf("v1: %x\n",&v1);
	printf("v2: %x\n",&v2);
	printf("v3: %x\n",&v3);
	printf("v4: %x\n",&v4);
	printf("file is :%s,\tfunction is: %s,\tline is :%d\n",__FILE__,__FUNCTION__,__LINE__);
}

int main()
{
	fun();
	printf("file is :%s,\tfunction is: %s,\tline is :%d\n",__FILE__,__FUNCTION__,__LINE__);
	return 0;
}

2.#宏字符串化

#include<stdio.h>
#define dprintf(expr) printf("<main>%s=%d\n",#expr,expr)
int main()
{
   int x=100;
   int y=2;

   dprintf(x/y);//#expr相当于x/y   expr是x/y的运算结果  #是字符串化操作
   dprintf(x+y);
   dprintf(x+y+2);
   return 0;
}

3.##连接字符串

#include<stdio.h>
#define test(x) test ##x
void test1(int a)
{
   printf("Test 1 integer: %d \n",a);
}
void test2(char *s)
{
   printf("Test 2 String: %s \n",s);
}
int main ()
{
   test(1)(100); //test(1)等价于test; test##1等价于test1;##连接字符
   test(2)("hello");
   return 0;
}

4.do...while(0)宏

#include<stdio.h>
#define hello(str) do{	printf("Hello:%s\n",str);	}while(0) 

int main()
{
	int m=0;
	if(m)
		{

		hello("hello true");
}
	else
		hello("hello false");
		 system("pause");
	return 0;
}

C语言中宏的使用(#,##,do…while(0)宏)

时间: 2024-10-10 14:25:08

C语言中宏的使用(#,##,do…while(0)宏)的相关文章

D语言中使用extern(Windows)类重载Object方法时的问题

使用D语言已经有快20天了,已经完成项目需要的基本功能,但还需进一步完善. 最近两三天在DGUI基础上移植了几个Window窗口控件,有TreeList(树+列表视图),DataList(数据列表),MdiFrom(多窗口),IEWebBrowser(IE浏览器),SciEditor(Sci源代码编辑器),DockPanel(notpad的Docking插件),SysHeader(表头控件), SysLink等几个标准Windows控件. 感谢DGUI的作者,对Windows控件做的布局管理及封

c语言中主要的关键字总结

register: 定义变量是寄存器保存,不写到内存上 因为在寄存器上,所以不能取地址 不能保存存放在data和bss段的数据 寄存器相当于内存的高速缓存,增加访问速度,但具体能够保存多少个由cpu决定,多余的将被忽略. static: static修饰变量: static修饰局部变量,第一次遇到时初始化,并将数据存放在data段,所以函数栈针回退时并不会销毁,在程序结束后销毁. static修饰全局变量:与全局变量不同的是,其他文件在链接时不能找到此变量符号的地址. c++中,全局变量影响封装

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

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

关于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 ##被称为连接符,用来将两个宏参数连接为一个宏参数.而单个#的功能是将其后面的宏参数进行字符串化操作,简单地说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号,使其成为字符串. 以上引自百度知

简单讲解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 

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

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

C语言学习笔记--C语言中的宏定义

1. C 语言中的宏定义 (1)#define 是预处理器处理的单元实体之一(因此,预处理器只是简单的进行替换,并不(2)#define 定义的宏可以出现在程序的任意位置(包括函数体的内部)(3)#define 定义之后的代码都可以使用这个宏 2. 定义宏常量 (1)#define 定义的宏常量可以直接使用(2)#define 定义的宏常量本质为字面量 3. 宏定义表达式 (1)#define 表达式的使用类似函数调用(2)#define 表达式可以比函数更强大(3)#define 表达式比函数