【问题标题】:Dynamic type in c [closed]c中的动态类型[关闭]
【发布时间】:2012-11-12 02:45:51
【问题描述】:

我们都知道c编程语言中没有动态类型。但是借助GCC中的typeof运算符,我们可以用c编程语言实现一些动态类型特性。最近我阅读了@987654322的源代码@,发现他们做得很优雅。


问题:

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

【问题讨论】:

  • 很明显,您的第一个问题的一个答案是“仅当您从不期望代码由 GCC 以外的编译器编译时”。
  • 是的,我在 Windows 和 Linux 中都使用 GCC。
  • 对于原始问题中的第二句“我们可以实现一些......”,typeof 是一个在编译时评估的宏。动态类型是指在运行时评估的一些东西。您可能也可以在 c 中实现与 c++ 中存在的 RTTI 类似的东西。基本思想是有一个最大大小的变量来包含任何数据,然后在运行时检查它的字节以确定实际存储在其中的值的类型。例如分配等于 long double 的空间,然后在运行时识别它是否在运行时实际上包含 char、short、int、float 或 double。
  • @fayyazkl 非常有用的提示,谢谢!

标签: c gcc typeof


【解决方案1】:

根据此链接http://gcc.gnu.org/onlinedocs/gcc/Typeof.html,似乎一种可能的用法类似于 C++ 模板

因此,您可以创建一个模板化的 C 函数来返回基于指定类型的数组的最小值。我确信这个运算符会产生深远的影响。

【讨论】:

【解决方案2】:

typeof 是 GCC 作为扩展提供的编译时构造。它可能用于编写安全宏,例如 gcc 手册中的示例:

#define max(a,b) \
({ typeof (a) _a = (a); \
       typeof (b) _b = (b); \
     _a > _b ? _a : _b; })

正如您提到的 Linux 内核,container_of() 宏是使用 typeof() 构造的一个很好的例子。它大量用于实现子类化,例如在设备驱动程序中。

内核中的另一个例子是数据结构,如链表,其中嵌入了列表。

#define container_of(ptr, type, member) ({                      \
    const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
    (type *)( (char *)__mptr - offsetof(type,member) );})

【讨论】:

  • container_of的出处,我前几天看了。请多举例!
猜你喜欢
  • 2021-03-27
  • 2019-10-02
  • 1970-01-01
  • 2016-04-15
  • 1970-01-01
  • 2021-12-02
  • 2010-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多