所在的位置: C++ >> C++介绍 >> C语言define的妙用

C语言define的妙用

QQ客服网络客服求职招聘QQ群 http://www.trends-love.com/shangye/16284.html

在C/C++编程语言中,当程序被编译时,被发送到编译器,编译器将程序转换为机器语言,然后完成编译并执行该程序。预处理器也称为宏预处理器。C/C++中的宏可以定义为一组程序语句,并在必须使用这些代码集时使用该名称。

这些宏始终以符号“#”开头,以该符号开头的语句由编译器调用。

#define奇妙用法

特殊符号:#,##,#

该宏还可用于传递可以通过在标记前使用“#”特殊符号将其转换为字符串的标记。让我们看一个例子:

#includestdio.h#defineGET_STRING(n)#nintmain(intargc,char*argv[]){printf("%s\n",GET_STRING(minger));return0;}

在上面的代码中,我们定义了类似函数的宏,其中参数“n”与“#n”一起传递,这将允许您检索字符串文字。

该宏还支持将可以传递给宏以使用特殊运算符“##”连接字符串。让我们看一个例子:

#includestdio.h#defineCONCATE(p,q)p##qintmain(intargc,char*argv[]){printf("%d\n",CONCATE(12,13));return0;}

上面的代码定义了类似函数的宏,其中传递令牌以连接“p”和“q”两个值。

下面我们接着看看#

使用。

#includestdio.h#defineTO_STRING(s)#sintmain(intargc,char*argv[]){printf("%s\n",TO_STRING());return0;}

在上面的代码中,我们定义了类似函数的宏,#s表示用双引号包括参数s,返回一个字符串。

多行宏

类似对象的宏可以有多行。因此,要创建多行宏,您必须使用反斜杠换行符。

#includestdio.h#defineELE1,\2,\3intmain(intargc,char*argv[]){inti=0;intarr[]={ELE};printf("ElementsofArrayare:\n");for(i=0;i3;i++){printf("%d",arr[i]);}printf("\n");return0;}

宏也可以写成多行,语句以“\”开头,不需要以“\”结尾。让我们再看一个例子:

#includestdio.h#defineMACRO(n,limit)while(nlimit)\{\printf("minger");\n++;\}intmain(intargc,char*argv[]){intn=0;MACRO(n,5);printf("\n");return0;}可变参数宏

可变参数宏是具有可变数量参数的宏(也可以用C编写可变参数函数)。下面是一个例子:

#includestdio.h#definedebugPrintf(...)printf("DEBUG:"__VA_ARGS__);intmain(intargc,char**argv){debugPrintf("HelloWorld!\n");return0;}

简单来说,...表示所有剩下的参数,__VA_ARGS__被宏定义中的...参数所替换。这在c语言的GNU扩展语法里是一个特殊规则:当__VA_ARGS__为空时,会消除前面这个逗号。

条件编译

#includestdio.h#definedebugPrintf/*定义一个宏开关,屏蔽则关闭,不屏蔽则打开*/#ifdefdebugPrintf#definedebugPrintf(...)printf("DEBUG:"__VA_ARGS__);#else#definedebugPrintf(...)#endifintmain(intargc,char**argv){debugPrintf("ThisisDebuginfo\n");printf("Thisisprintfinfo\n");return0;}

如果我们要输出DEBUG版本,则打开这个宏开关(不屏蔽#definedebugPrintf),此时所有的debugPrintf()宏定义信息都会被替换成为printf()。

总结

宏是程序中由宏的值替换的一段代码。宏由#define指令定义。每当编译器遇到宏名称时,它就会用宏的定义替换名称。宏定义不需要以分号;结束。

文章出处




转载请注明:http://www.aierlanlan.com/rzfs/217.html