教学资源库网站建设立项申报书,wordpress 主题笔记,蓟县集团网站建设,广告公司寮步网站建设前言 #xff08;1#xff09;如果有嵌入式企业需要招聘湖南区域日常实习生#xff0c;任何区域的暑假Linux驱动实习岗位#xff0c;可C站直接私聊#xff0c;或者邮件#xff1a;zhangyixu02gmail.com#xff0c;此消息至2025年1月1日前均有效 #xff08;2#xff0…前言 1如果有嵌入式企业需要招聘湖南区域日常实习生任何区域的暑假Linux驱动实习岗位可C站直接私聊或者邮件zhangyixu02gmail.com此消息至2025年1月1日前均有效 2最近看到一个问题关于C语言的函数形参是否能够有默认值的探讨。一开始我个人认为C语言的函数形参是不能有默认值的后面不看不知道一查吓一跳发现还真的有这种玩法在此推荐给大家。 3需要注意的是如下方法要求在C99标准以上的编译器中使用。 4学习本文之前建议先去了解一下C语言可变参数这是本人往期讲解可变参数的博客 1如何编写一个可变参数函数如何让所有单片机的所有串口实现printf函数 2单片机如何实现日志等级打印适用于多线程多串口 理论讲解 1如果学习过C的朋友都知道在C中函数有一个默认参数。在C语言中我们能否也实现默认参数呢 “__ VA_ARGS __”宏介绍 1我们都知道C语言的函数存在可变参数例如经典的printf()函数。有函数有可变参数那么宏定义有没有可变参数呢 2显然是有了本文介绍的__ VA_ARGS __这个宏就是用来传递可变参数列表的。使用方法如下 #include stdio.h// 简单的可变参数宏将可变参数打印到控制台
#define PRINT_VARIABLE_ARGS(format, ...) printf(format, __VA_ARGS__)int main()
{// 使用宏打印不定数量的参数PRINT_VARIABLE_ARGS(Hello, %s! The sum is: %d\n, John, 1020);return 0;
}3现在我们知道了__ VA_ARGS __这个宏的作用那么又有什么实际意义呢想要更详细了解的请看单片机如何实现日志等级打印适用于多线程多串口 “##”的用法 1对于__ VA_ARGS __这个宏有一个特点就是说如果宏定义的可变列表...中没有传入任何值。__ VA_ARGS __就将会是一个空值。 2以上面的代码为例子假如我们可变参数里面不传入任何值将会出现如下问题 #include stdio.h// 简单的可变参数宏将可变参数打印到控制台
#define PRINT_VARIABLE_ARGS(format, ...) printf(format, __VA_ARGS__)int main()
{// 使用宏打印不定数量的参数PRINT_VARIABLE_ARGS(Hello world);return 0;
}# 只进行预编译
gcc -E -P -o test.i test.c
# 编译
gcc test.c3为了解决这个问题我们可以使用##这个特殊的操作。如果可变参数被忽略或为空##操作将使预处理器(preprocessor)去除掉它前面的那个逗号。例如我们将代码修改成如下进入编译就能够成功通过。 #include stdio.h// 简单的可变参数宏将可变参数打印到控制台
#define PRINT_VARIABLE_ARGS(format, ...) printf(format, ##__VA_ARGS__)int main()
{// 使用宏打印不定数量的参数PRINT_VARIABLE_ARGS(Hello world);return 0;
}逗号运算符 1我们要实现默认参数还需要使用到逗号运算符。**逗号运算符的运算优先级会把逗号后边的值输出返回。**例如(123,321)最终输出的是321。 实现一个默认参数 1有了上面的基础我们现在就可以实现一个函数默认参数了。 2实现多个形参的默认参数目前还没想到处理办法现在就只能实现一个默认形参的默认参数。如果有大佬知道如何实现多个形参的默认参数欢迎赐教。 C代码 1首先我们创建一个C文件里面输入如下内容。 #include stdio.h#define fun(...) _fun((123, ##__VA_ARGS__));void _fun(int val)
{printf(fun input val:%d, val);
}int main()
{fun();printf(\r\n---\r\n);fun(321);
}2执行代码最终结果如下。 fun input val:123
---
fun input val:321参考 1微信公众号C语言怎么给函数添加形参的默认值 2C站整理C/C可变参数“## VA_ARGS”宏的介绍和使用 3C站C语言中#“和”##的用法 4C站C语言中逗号运算符怎么用? 5C站单片机如何实现日志等级打印适用于多线程多串口 6C站如何编写一个可变参数函数如何让所有单片机的所有串口实现printf函数