gpt4 book ai didi

c - typeof 在 C 中的使用,除了宏

转载 作者:行者123 更新时间:2023-12-01 11:39:33 25 4
gpt4 key购买 nike

众所周知,在宏中使用 typeof 使它们与类型无关,例如 container_of() 和 Linux 内核中的许多其他宏。毫无疑问,typeof 关键字在这些宏中使用时会释放出很大的力量。

这个问题是关于typeof关键字的进一步使用。除了宏之外,关键字还能在哪些其他上下文中为 C 代码带来很多好处?

最佳答案

typeof 的一个用途是const-cast 二维数组。在 gcc 中,构造:

  extern void foo(const int a[2][2]); // or equivalently a[][2]
int a[2][2];
foo(a);

将生成:

"warning: passing argument 1 of 'foo' from incompatible pointer type".

(请参阅 http://c-faq.com/ansi/constmismatch.html 了解原因。)解决此问题的一种方法是使用类似大锤的铸件,例如:

  foo((void *)a);

这样的 Actor 会很乐意接受你给的任何东西,也许是错误的。

但我们可以更加精致。通过使用以下代码示例中给出的类型转换宏 CONST_CAST_2D,可以消除警告。更重要的是,如果您尝试将它应用于二维数组以外的任何对象,您将收到编译器错误/警告。 CONST_CAST_PP 的工作原理类似,用于指向指针的指针。

#define CONST_CAST_2D(x)  ((const typeof((x)[0][0])(*)[countof((x)[0])])(x))
#define CONST_CAST_PP(x) ((const typeof(**(x))**)(x))
#define countof(x) (sizeof(x) / sizeof 0[x]) // semi-standard define

static void foo(const int a[][2]) {} // takes const
static void bar(const int **b) {} // takes const

int main(void) {
int a[2][2]; // non-const
int **b; // non-const
foo(CONST_CAST_2D(a)); // ok
bar(CONST_CAST_PP(b)); // ok
return 0;
}

CONST_CAST_PP 为常见问题提供了一个干净而强大的解决方案,例如:

CONST_CAST_2D 解析:

关于c - typeof 在 C 中的使用,除了宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22851465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com