在 C/C++ 编程语言中,当程序被编译时,被发送到编译器,编译器将程序转换为机器语言,然后完成编译并执行该程序。预处理器也称为宏预处理器。C /C++中的宏可以定义为一组程序语句,并在必须使用这些代码集时使用该名称。
这些宏始终以符号“#”开头,以该符号开头的语句由编译器调用。
#define 奇妙用法
- 特殊符号:#,##,#@
该宏还可用于传递可以通过在标记前使用“#”特殊符号将其转换为字符串的标记。让我们看一个例子:
int main(int argc, char *argv[])
{
printf("%s ", GET_STRING(minger));
return 0;
}
在上面的代码中,我们定义了类似函数的宏,其中参数“n”与“#n”一起传递,这将允许您检索字符串文字。
该宏还支持将可以传递给宏以使用特殊运算符“##”连接字符串。让我们看一个例子:
int main(int argc, char *argv[])
{
printf("%d ", CONCATE(12, 13));
return 0;
}
上面的代码定义了类似函数的宏,其中传递令牌以连接“p”和“q”两个值。
下面我们接着看看#@使用。
int main(int argc, char *argv[])
{
printf("%s ", TO_STRING(812));
return 0;
}
在上面的代码中,我们定义了类似函数的宏,#s 表示用双引号包括参数s,返回一个字符串。
- 多行宏
类似对象的宏可以有多行。因此,要创建多行宏,您必须使用反斜杠换行符。
2,
3
int main(int argc, char *argv[])
{
int i = 0;
int arr[] = { ELE };
printf("Elements of Array are: ");
for (i = 0; i < 3; i++)
{
printf("%d ", arr[i]);
}
printf(" ");
return 0;
}
宏也可以写成多行,语句以“”开头,不需要以“”结尾。让我们再看一个例子:
{
printf( );
n++;
}
int main(int argc, char *argv[])
{
int n = 0;
MACRO(n, 5);
printf(" ");
return 0;
}
- 可变参数宏
可变参数宏是具有可变数量参数的宏(也可以用 C 编写可变参数函数)。下面是一个例子:
int main(int argc, char** argv)
{
debugPrintf("Hello World! ");
return 0;
}
简单来说,...表示所有剩下的参数,__VA_ARGS__被宏定义中的...参数所替换。这在c语言的GNU扩展语法里是一个特殊规则:当__VA_ARGS__为空时,会消除前面这个逗号。
- 条件编译
int main(int argc, char** argv)
{
debugPrintf(" This is Debug info ");
printf(" This is printf info ");
return 0;
}
如果我们要输出DEBUG版本,则打开这个宏开关(不屏蔽#define debugPrintf ),此时所有的debugPrintf ()宏定义信息都会被替换成为printf()。
总结
宏是程序中由宏的值替换的一段代码。宏由#define 指令定义。每当编译器遇到宏名称时,它就会用宏的定义替换名称。宏定义不需要以分号;结束。
-
语言
+关注
关注
1文章
96浏览量
24239 -
代码
+关注
关注
30文章
4762浏览量
68408 -
编译器
+关注
关注
1文章
1618浏览量
49075
原文标题:#define的妙用
文章出处:【微信号:c-stm32,微信公众号:STM32嵌入式开发】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论