C技巧:结构体参数转成不定参数

标签: 技巧 结构 参数 | 发表时间:2011-02-28 18:09 | 作者:haoel Ya Shou
出处:http://blog.csdn.net/haoel

酷壳:http://coolshell.cn/articles/2801.html

 

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#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稀奇古怪的用法。 如果你把宏展开后,你就明的为什么了。下面是宏展开的样子:

1
2
3
4
5
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});

作者:haoel 发表于2011-2-28 10:09:00 原文链接
阅读:5050 评论:12 查看评论

相关 [技巧 结构 参数] 推荐:

C技巧:结构体参数转成不定参数

- Ya Shou - 陈皓专栏 【空谷幽兰,心如皓月】
酷壳:http://coolshell.cn/articles/2801.html. 下面这段程序是一个C语言的小技巧,其展示了如何把一个参数为结构体的函数转成一个可变参数的函数,其中用到了宏和内建宏“__VA_ARGS__”,下面这段程序可以在GCC下正常编译通过:. 从上面这段程序,我们可以看到一个叫 myfunc的函数,被func的宏改变了,本来myfunc需要的是一个叫mystru的结构,然而通过宏,我们把struct mystru的这个参数,变成了不定参数列表的一个函数.

lua中处理变参数的一些技巧

- return - 为着理想勇敢前进
从lua 5.1开始,就不鼓励用隐含的arg来处理可变变量了,推荐做法是使用递归来处理.... 在lua中,不论多返回值还是函数调用,...都只能用于最后剩下的参数,例如下列代码中. 这是因为第一个print调用是把...作为剩余的所有参数传进去,而第二次调用,...则被调整为1个参数. 如果要想把参数添加到...后面,有两种做法.

JMETER 参数化

- - 开源软件 - ITeye博客
用Jmeter中的函数获取参数值,__Random,__threadNum,__CSVRead,__StringFromFile. 2.用户定义的变量 “配置元件”->“用户定义的变量”. 从csv文件中读取“配置元件”->“CSV Data Set Config”. 调用方法${id_g1} ${id_g2} ${id_g3}.

JBPM表结构

- - CSDN博客综合推荐文章
      JBPM全称——Java  Business PrcessManagerment(业务流程管理),它是覆盖了业务流程管理、工作流、服务协作等领域的一个开放的、灵活的、易扩展的可执行流程语言框架.        (1)它的业务逻辑定义没有采用目前的一些规范,而是采用了它自己定义的Jboss Jbpm Process Definition Language(jpdl).

Hadoop MapReduce技巧

- - 简单文本
我在使用Hadoop编写MapReduce程序时,遇到了一些问题,通过在Google上查询资料,并结合自己对Hadoop的理解,逐一解决了这些问题. Hadoop对MapReduce中Key与Value的类型是有要求的,简单说来,这些类型必须支持Hadoop的序列化. 为了提高序列化的性能,Hadoop还为Java中常见的基本类型提供了相应地支持序列化的类型,如IntWritable,LongWritable,并为String类型提供了Text类型.

WordPress 技巧

- - CSDN博客互联网推荐文章
WordPress字体设置方法详解.          WordPress开源程序功能越来越强大,未来我们不仅仅可以使用wordpress制作个人博客,还可以使用wordpress程序制作CMS内容管理系统. 很多 Wordpress主题SEO优化的非常好,而且还附带了一些adsense广告位置,让不懂SEO以及代码修改的朋友轻松解决博客优化以及广告位放置问题.

javascript技巧

- - ITeye博客
oncontextmenu="window.event.returnValue=false"  将彻底屏蔽鼠标右键. < table border oncontextmenu=return(false)>< td>no< /table>  可用于Ta bl e. < body onselectstart="return false">  取消选取、防止复制.

linux 小技巧

- - DBA Blog
2:如何限制用户的最小密码长度. 修改/etc/login.defs里面的PASS_MIN_LEN的值. 比如限制用户最小密码长度是8:. 3:如何使新用户首次登陆后强制修改密码. 4:更改Linux启动时用图形界面还是字符界面. 将id:5:initdefault: 其中5表示默认图形界面. 改id:3: initdefault: 3表示字符界面.

面试技巧

- - 非技术 - ITeye博客
问题一:“请你自我介绍一下” .   1、这是面试的必考题目.   2、介绍内容要与个人简历相一致.   3、表述方式上尽量口语化.   4、要切中要害,不谈无关、无用的内容.   5、条理要清晰,层次要分明.   6、事先最好以文字的形式写好背熟. 问题二:“谈谈你的家庭情况” .   1、 况对于了解应聘者的性格、观念、心态等有一定的作用,这是招聘单位问该问题的主要原因.

Eclipse.ini参数分析

- - CSDN博客推荐文章
         我只修改过一次eclipse.ini文件,是因为myeclipse使用出了问题:编辑jsp页面的时候写java代码,只要用到自带的关联提示(例如String.,只要敲击“.”就会卡死). 后来同事说可以试着修改eclipse.ini文件,把内存改大一点也许就行了,结果改了N次几乎到1G了还是没解决.