2012-11-12 89 views
1

我们都知道,有没有在GCC typeof运营商的帮助下动态类型在C编程language.But,我们可以实现一些动态类型的C语言编程的特性language.Recently我读的烃源代码talloc,并发现他们优雅地做。动态类型


问题:

  • 在这情况下,我们应该使用typeof技能?
  • 请给我更多的例子,尤其是在Linux内核中使用的技术。(除the container_of()马可)
+1

显然,对于第一个问题的一个答案是“只有当你不希望代码被GCC以外的编译器编译时”。 –

+0

是的,我在Windows和Linux中都使用GCC。 – prehistoricpenguin

+0

对于原始问题“我们可以实现一些...”中的第二句话,typeof是在编译时评估的宏。动态类型是指在运行时评估某些事物。你可能可以实现一些类似于c中C++中存在的RTTI的东西。基本思想是使用最大大小的变量来包含任何数据,然后在运行时检查它的字节数以确定实际存储在其中的类型的值。对于例如分配等于一个long double的空间,然后在运行时识别它是否在运行时实际上包含char,short,int,float或double。 – fayyazkl

回答

0

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));}) 
+0

对于'container_of'的来源,我前几天读过它。请更多的例子! – prehistoricpenguin

2

这似乎是一个可能的使用将按照此链接http://gcc.gnu.org/onlinedocs/gcc/Typeof.html

是类似于C++模板所以,你可以创建一个模板化的C函数来返回基于指定类型的数组的最小值。我相信这个运营商有深远的影响。

+0

问题二呢? – prehistoricpenguin

+1

偶然地,我是对的。 Linux内核使用宏来使用typeof关键字查找两个值的最小值或最大值。 http://lxr.free-electrons.com/source/include/linux/kernel.h – cowboydan