首页 > 系统相关 >Linux C 进阶 —— 可变参数

Linux C 进阶 —— 可变参数

时间:2023-09-06 09:59:07浏览次数:41  
标签:va 进阶 Linux fmt args char tag 可变 PRINT

 1 #include <stdio.h>
 2 #include <stdarg.h>
 3 /* 方式1 C99宏方式   GNU C扩展 宏方式 */
 4 #define MC_C99_PRINT(fmt,...) printf(fmt, ##__VA_ARGS__)   //## 作用:当变参列表为空时,消除 fmt 后的逗号 
 5 #define MC_GNC_PRINT(fmt,args...) printf(fmt, ##args)
 6 /* 方式2 可变参数函数方式 */
 7 void PRINT(int tag, ...)
 8 {
 9         char *pc = NULL;
10         int   i  = 0;
11         va_list args;
12         char *fmt = NULL;
13 
14         va_start(args, tag);
15         if (tag == 1)
16         {
17                 i = va_arg(args, int);
18                 printf("i=%d\n", i);
19         }
20         else if(tag == 2)
21         {
22                 pc = va_arg(args, char*);
23                 printf("%s\n", pc);
24         }
25         else
26         {
27                 fmt = va_arg(args, char*);
28                 vprintf(fmt, args);
29         }
30         va_end(args);
31         return;
32 }
33 
34 __attribute__((format(printf, 2, 3))) void DEBUG(char* tag,  char* fmt, ...);
35 void DEBUG(char* tag, char* fmt, ...)
36 {
37         va_list ap;
38 
39         va_start(ap, fmt);
40         printf("%s", tag);
41         vprintf(fmt, ap);
42         va_end(ap);
43 }
44 
45 int main()
46 {
47         PRINT(1, 12);
48         PRINT(2, "Hello");
49         PRINT(3, "HF %d\n", 33);
50         PRINT(4, "China\n");
51 
52         DEBUG("[TRACE] ", "%s\n", "world");
53 
54         MC_C99_PRINT("C99_MAC\n");
55         MC_GNC_PRINT("GNC %s\n", "extern");
56 
57         return 0;
58 }

 

标签:va,进阶,Linux,fmt,args,char,tag,可变,PRINT
From: https://www.cnblogs.com/rtthread/p/17681481.html

相关文章

  • Linux应用编程_多线程编程
    (1)线程的创建: pthread_ttid=pthread_self(); //获取当前线程的tid号 intret=pthread_create(&tid1,NULL,fun1,(void*)&a);//创建线程传入变量a的地址 ret=pthread_create(&tid2,NULL,fun2,(void*)(long)a);//创建线程传入变量a的值(2)线程的退出与回收: pth......
  • Linux应用编程_网络通信TCP/UDP
    (1)网络协议被分为5层 1)应用层:直接为用户的应用进程提供服务 HTTP协议,FTP协议,DNS,POP3,SNMP,Telnet 2)运输层(传输层):负责向两个主机中进程之间的通信提供服务 (基于TCP/UDP) (1)传输控制协议TCP(TransmissionControlProtocol): 1)数据传输的单位是报文段 2)面向......
  • Linux 命令总结
    Linux文件系统FHS3.0(FilesystemHierarchyStandard)/etc配置文件bin必要命令usr二级目录home家目录var动态数据VFS虚拟文件系统内核层抽象出通用的文件系统接口支持文件、网络、特殊文件系统抽象对象:超级快:文件系统目录项:文件路径索引节点:具体文件文件:进程打开的文件属性分层......
  • Linux运维工程师面试题(7)
    Linux运维工程师面试题(7)祝各位小伙伴们早日找到自己心仪的工作。持续学习才不会被淘汰。地球不爆炸,我们不放假。机会总是留给有有准备的人的。加油,打工人!1常用的ansible模块有哪些PingCommandShellScriptCopyFetchFileYumServiceUserGroupLineinfileRepla......
  • C进阶(数据存储)
    空类型void表示空类型(无类型)通常应用于函数的返回类型、函数的参数、指针类型大小端存储模式(使用代码段判断大小端)大端存储 数据的低位保存在内存的高地址中,而数据高位,保存在内存低地址中小端存储数据的低位保存在内存的低地址中,而数据高位,保存在内存高地址中补码反码原码三种表......
  • Linux运维工程师面试题(7)
    目录Linux运维工程师面试题(7)1常用的ansible模块有哪些2说一下ansible使用roles编排的目录结构3docker六大命名空间namespace4cgroups的作用5runc的作用6docker常用的命令7docker存储引擎有哪些,区别是什么8进入docker容器有几种方法,区别是什么9Dockerfile......
  • C进阶(指针)
    一维数组传参的几种形式(5种)voidtest(intarr[])//{}voidtest(intarr[10])//{}voidtest(int*arr)//{}voidtest2(int*arr[20])//{}voidtest2(int**arr)//{}intmain(){intarr[10]={0};int*arr2[20]={0};test(arr);test2(arr2);}二维数组传参的几......
  • linux系统调优
    1.禁用swap分区swapoff-a&&sysctl-wvm.swappiness=0sed-ri'/^[^#]*swap/s@^@#@'/etc/fstabgrepswap/etc/fstab2. 禁用防火墙和selinux2.1禁用防火墙,网络管理,邮箱systemctldisable --nowfirewalldNetworkManagerpostfix 2.2禁用selinux2.2.1命令行直......
  • linux日志文件的查询方式
    cdlog到指定log日志文件目录ls查看当前文件存在的目录catjujube.log可以查看较小的日志文件vijujube.log查看较大的日志文件(常用)/(查询的字符)可以定位到这个字符的位置N继续向下检索:$回到日志文件的最底层可以用于从底层开始查找使用:$后配合使......
  • Linux中有哪些常用的网络命令,分别适用于什么场景?
    Linux作为一种广泛使用的操作系统,其网络功能非常强大。在Linux系统中,有很多网络相关的命令可以用于管理和配置网络,比如ifconfig、netstat、ping、traceroute、route等等。本文将对一些常用的Linux网络命令进行详细介绍。一、ifconfig命令ifconfig命令用于显示和配置Linux系统的网......