下面这段程序是一个C语言的小技巧,其展示了如何把一个参数为结构体的函数转成一个可变参数的函数,其中用到了宏和内建宏“__VA_ARGS__”,下面这段程序可以在GCC下正常编译通过:

#include <stdio.h> #define func(...) myfunc((struct mystru){__VA_ARGS__}) struct mystru { const char *name; int number; }; void myfunc(struct mystru ms ) { printf("%s: %d/n", ms.name ?: "untitled", ms.number); } int main(int argc, char **argv) { func("three", 3); func("hello"); func(.name = "zero"); func(.number = argc, .name = "argc",); func(.number = 42); return 0; }

从上面这段程序,我们可以看到一个叫 myfunc的函数,被func的宏改变了,本来myfunc需要的是一个叫mystru的结构,然而通过宏,我们把struct mystru的这个参数,变成了不定参数列表的一个函数。上面这段程序输出入下,

three: 3
hello: 0
zero: 0
argc: 1
untitled: 42

虽然,这样的用法并不好,但是你可以从另外一个方面了解一下这世上对C稀奇古怪的用法。 如果你把宏展开后,你就明的为什么了。下面是宏展开的样子:

myfunc((struct mystru){"three", 3}); myfunc((struct mystru){"hello"}); myfunc((struct mystru){.name = "zero"}); myfunc((struct mystru){.number = argc, .name = "argc",}); myfunc((struct mystru){.number = 42});

C技巧:结构体参数转成不定参数相关推荐

  1. 结构体 — C 语言中不定长结构体的使用

    1.结构体的定长表示 C语言中结构体的使用基本上都是定长的,就如以下这种: typedef struct {int a;int b;char c[100];double d; }STRU; 2.结构体 ...

  2. c++ 结构体地址 转换成ulong_零基础入门之结构体字节对齐

    一.字节对齐的规则: 1.一般设置的对齐方式为1,2,4字节对齐方式.结构的首地址必须是结构内最宽类型的整数倍地址;另外,结构体的每一个成员起始地址必须是自身类型大小的整数倍(需要特别注意的是wind ...

  3. c结构体中定义的成员指针赋值与结构体指针作为成员函数参数的使用

    c语言定义结构体可以直接声明结构体变量的,如下 struct Student{char *name; int age; }xiaoming 这样以来,我们就定义了一个结构体类型,同时声明了一个结构体变 ...

  4. 技巧:Go 结构体如何转换成 map[string]interface{}

    本文介绍了Go语言中将结构体转成map[string]interface{}时你需要了解的"坑",也有你需要知道的若干方法. 我们在Go语言中通常使用结构体来保存我们的数据,例如要 ...

  5. c++ 结构体地址 转换成ulong_一个WinApi Hook程序(下)

    我这个项目是用VS2015 Community创建的.项目里设置的编译目标平台是Win8.1,底层库设置的VS2015,估计低版本的VS打开项目里的C++项目应该会有问题,而且因为我系统是Win7(还 ...

  6. c语言如何传递结构体指针,注意使用结构体指针给函数传递参数。

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 为了增加参数调用的灵活性,可以利用结构体指针传递多个不同的参数进入C语言函数体. 最著名的例子就是用Win32API HANDLE CreateThrea ...

  7. C语言 结构体,内存对齐,对齐参数,偏移量

    文章目录 sizeof() 内存对齐 内存对齐的背景 全部规则汇总(看这里) 典型例子: Pragma Pack(n)与内存分配 #pragma pack对对齐模数的影响 偏移量 sizeof() 对 ...

  8. ACM 常用技巧 结构体排序 粗粗粗粗讲

    首先说下结构体这种东西,就是,具有同种结构的一堆变量,可以塞到一个叫struct的东西里,声明方法如下.(ps. 别忘了加头文件<cstdlib>)再透露一下,由于本人代码能力菜的一*,所 ...

  9. c语言 机构体传给指针,注意使用结构体指针给函数传递参数。

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 为了增加参数调用的灵活性,可以利用结构体指针传递多个不同的参数进入C语言函数体. 最著名的例子就是用Win32API HANDLE CreateThrea ...

最新文章

  1. linux设备驱动学习笔记(1)
  2. 当顶流厂商谈论智能手表,他们到底在谈论什么
  3. nginx基本配置与参数说明
  4. 深入理解IIS的多线程工作机制
  5. 使用zTree和json构建简单树节点
  6. 高通笔记本装linux,在华硕畅370(TP370QL)骁龙笔记本上安装Ubuntu 18.04 ARM64的方法...
  7. 一天一个产品分析之Finger_米米米米粒口红_新浪博客
  8. 华三交换机配置access命令_华三交换机配置中,shutdown这条命令怎么用?
  9. 杭电ACM2030题
  10. ET框架---ClientFrameComponent学习笔记
  11. 如何给grldr.mbr和grldr改名
  12. unity制作伪全息投影
  13. KanziStudio应用程序配置详解
  14. 9个学习资源分享给大家,总有你需要的干货!
  15. 线性回归和卡方分布与方差分析
  16. vue项目利用Hbuilder打包成APP流程,以及遇到的坑
  17. 判断一个人有没有管理能力,就看这1点!
  18. 那些年,你与快递小哥的爱恨情仇...
  19. php 搜索字符串ctrl f_js搜索关键字(Ctrl + F)
  20. uA741运算放大器原理

热门文章

  1. 自定义View合辑(8)-跳跃的小球(贝塞尔曲线)
  2. Docker mongo副本集环境搭建
  3. 【BIEE】数据透视表格第一列添加序号
  4. activeMQ - 消息重发策略和DLQ死信队列
  5. 记一次大规模数据迁移和加密
  6. 几种开源工作流引擎的简单比较(转)
  7. gpupdate /force 遇报错解决过程
  8. 区块链技术的标准化和颠覆性
  9. javascript 代码_如何使您JavaScript代码保持简单并提高其可读性
  10. bokeh pandas_使用Pandas和Bokeh将Rolling Stone的500张最伟大专辑可视化