使用 #define 定义些奇妙用法

在 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;
}

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

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

#include <stdio.h>
#define CONCATE(p, q) p##q

int main(int argc, char *argv[])
{
	printf("%d \n", CONCATE(12, 13));
	return 0;
}

在这里插入图片描述

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

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

#include <stdio.h>
#define TO_STRING(s) #s

int main(int argc, char *argv[])
{
	printf("%s\n", TO_STRING(812));
	return 0;
}

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

  • 多行宏

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

#include <stdio.h>
 
#define ELE 1, \
            2, \
            3
 
int 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;
}

在这里插入图片描述
宏也可以写成多行,语句以“\”开头,不需要以“\”结尾。 让我们再看一个例子:

#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;
}

在这里插入图片描述

  • 可变参数宏

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

#include <stdio.h>

#define debugPrintf(...) printf("DEBUG: " __VA_ARGS__);

int main(int argc, char** argv)
{
	debugPrintf("Hello World!\n");
	return 0;
}

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

  • 条件编译
#include<stdio.h>

#define debugPrintf /*定义一个宏开关,屏蔽则关闭,不屏蔽则打开 */

#ifdef debugPrintf
#define debugPrintf(...) printf("DEBUG: " __VA_ARGS__);
#else
#define debugPrintf(...)
#endif
int main(int argc, char** argv)
{
	debugPrintf(" This is  Debug info\n");
	printf(" This is  printf  info\n");
	return 0;
}

在这里插入图片描述

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

总结

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

欢迎关注微信公众号【程序猿编码

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值