我们都知道,有没有在GCC typeof
运营商的帮助下动态类型在C编程language.But,我们可以实现一些动态类型的C语言编程的特性language.Recently我读的烃源代码talloc
,并发现他们优雅地做。动态类型
问题:
- 在这情况下,我们应该使用
typeof
技能? - 请给我更多的例子,尤其是在Linux内核中使用的技术。(除
the container_of()
马可)
我们都知道,有没有在GCC typeof
运营商的帮助下动态类型在C编程language.But,我们可以实现一些动态类型的C语言编程的特性language.Recently我读的烃源代码talloc
,并发现他们优雅地做。动态类型
问题:
typeof
技能?the container_of()
马可)typeof
是由GCC提供作为扩展编译时构建体。正如您所提到的Linux内核中,container_of()
宏是使用typeof()
结构的一个很好的例子
#define max(a,b) \
({ typeof (a) _a = (a); \
typeof (b) _b = (b); \
_a > _b ? _a : _b; })
:它可以用来编写安全的宏,就像在GCC手册的例子。它主要用于实现子类化,例如在设备驱动程序。
内核中的另一个例子是数据结构,如链接列表,其中嵌入了列表。
#define container_of(ptr, type, member) ({ \
const typeof(((type *)0)->member) *__mptr = (ptr); \
(type *)((char *)__mptr - offsetof(type,member));})
对于'container_of'的来源,我前几天读过它。请更多的例子! – prehistoricpenguin
这似乎是一个可能的使用将按照此链接http://gcc.gnu.org/onlinedocs/gcc/Typeof.html
是类似于C++模板所以,你可以创建一个模板化的C函数来返回基于指定类型的数组的最小值。我相信这个运营商有深远的影响。
问题二呢? – prehistoricpenguin
偶然地,我是对的。 Linux内核使用宏来使用typeof关键字查找两个值的最小值或最大值。 http://lxr.free-electrons.com/source/include/linux/kernel.h – cowboydan
显然,对于第一个问题的一个答案是“只有当你不希望代码被GCC以外的编译器编译时”。 –
是的,我在Windows和Linux中都使用GCC。 – prehistoricpenguin
对于原始问题“我们可以实现一些...”中的第二句话,typeof是在编译时评估的宏。动态类型是指在运行时评估某些事物。你可能可以实现一些类似于c中C++中存在的RTTI的东西。基本思想是使用最大大小的变量来包含任何数据,然后在运行时检查它的字节数以确定实际存储在其中的类型的值。对于例如分配等于一个long double的空间,然后在运行时识别它是否在运行时实际上包含char,short,int,float或double。 – fayyazkl