这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » #define的妙用

共2条 1/1 1 跳转至

#define的妙用

高工
2022-03-09 08:10:24     打赏

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

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

#define 奇妙用法

  • 特殊符号:#,##,#@

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

#include <stdio.h>#define GET_STRING(n) #n
int main(int argc, char *argv[]){ printf("%s\n", GET_STRING(minger)); return 0;}

image.png

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

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

#include <stdio.h>#define CONCATE(p, q) p##qint main(int argc, char *argv[]){ printf("%d \n", CONCATE(12, 13)); return 0;}

image.png

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

    下面我们接着看看#@使用。

#include <stdio.h>#define TO_STRING(s) #s
int main(int argc, char *argv[]){ printf("%s\n", TO_STRING(812)); return 0;}

image.png

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

  • 多行宏

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

#include <stdio.h> #define ELE 1, \            2, \            3int main(int argc, char *argv[]){ int i = 0;    int arr[] = { ELE };    printf("Elements of Array are:\n");     for (i = 0; i < 3; i++)  {        printf("%d  ", arr[i]);    } printf("\n");     return 0;}

image.png

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


#include <stdio.h> #define MACRO(n, limit) while (n < limit) \{ \printf("minger "); \n++; \}int main(int argc, char *argv[]){ int n = 0; MACRO(n, 5); printf("\n"); return 0;}

image.png

  • 可变参数宏

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

#include <stdio.h>#define debugPrintf(...) printf("DEBUG: " __VA_ARGS__);int main(int argc, char** argv){ debugPrintf("Hello World!\n"); return 0;}

image.png

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

  • 条件编译
#include<stdio.h>#define debugPrintf /*定义一个宏开关,屏蔽则关闭,不屏蔽则打开 */#ifdef debugPrintf#define debugPrintf(...) printf("DEBUG: " __VA_ARGS__);#else#define debugPrintf(...)#endifint main(int argc, char** argv){ debugPrintf(" This is  Debug info\n"); printf(" This is  printf  info\n"); return 0;}

image.png

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

总结

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





关键词: #define     妙用    

院士
2022-03-09 08:53:56     打赏
2楼

我个人不建议使用这种预定义的方式。

跳转查找好不方便


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]