酷壳: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});
|
分享到:
相关推荐
C语言程序设计;;§10.1 结构体概念 数据的基本类型:整、实、字符。 数组是构造类型:每个元素为同一类型 有些问题仅用基本类型和数组来描述,无法反映其内在联系,如学生情况。 ;id;定义结构体类型变量的方法 声明...
C语言:指向结构体的指针.c
关于C语言----六:结构体
重点阐述数据结构: 结构体与链表,深入详解数据结构。
计算机二级《C语言》辅导笔记:结构体与共用体.docx
复习:结构体和指针.docx
C语言教学课件:c语言结构体.ppt
C语言结构体的内存大小
第7讲 聚合数据组织与处理:结构体.pdf
C语言课件:10结构体与共用体.ppt
C++结构体参数与结构体指针参数区别Demo(资源包括C++源程序和编译好的exe文件)
C语言程序设计:c语言结构体.ppt
将结构体变量作为函数参数,是将实参值传递给形参,属于值传递。将结构体所有参数传递给形参使用,但本身的值不会改变。将指向结构体变量的指针作为实参进行传递时,是将结构体变量的地址传递给形参,属于地址传递,...
可实现将C语言中的结构体转换为JAVA类型的实体类。 目前支持基础数据类型int、long、foloat、double、const char *、bool的转换,也支持将数组装换为JAVA中的ArrayList。目前有个难点是将枚举类型直接转换为JAVA中的...
1.添加联系人 2.显示联系人 3.删除联系人 4.修改联系人 5.清空联系人 6.退出
结构体可由多中数据类型的元素组成(将不同的数据类型组合成为一个整体),比如描述一个学生信息,学生的学号使用long int类型存储、年龄用int类型存储、姓名用字符串(字符数组)存储。如果是一个学生,可以只需声明3个...