gpt4 book ai didi

在编译时检查宏参数的类型

转载 作者:行者123 更新时间:2023-12-02 05:37:34 25 4
gpt4 key购买 nike

为了检查两个变量是否具有相同的结构类型,我使用了一个宏

#define assert_same_struct_types(a, b)    ((void) (sizeof((a)=(b))))

如果一些类似函数的宏

#define m(a,b) blablabla

假设 a 和 b 应该是相同的结构类型,我添加了一个编译时检查:

#define m(a,b) (assert_same_struct_types(a, b), blablabla)

如果 m(a,b) 的调用者不小心传递给 m 个不同类型的结构,则会引发编译器错误。

但是,这种方法并不总是适用于内置类型和指针类型,因为它们之间存在隐式转换。

那么,是否可以针对任意类型(不一定是结构)解决这个问题?

我需要一个适用于 C89 的解决方案,但是,如果能了解 C99 或 C11 的可能性,我会很感兴趣。

最佳答案

#define ASSERT_SAME_TYPE(a, b)  ((void) (&(a) == &(b)))

将为您提供一个编译诊断和一个带有 -Werror 的错误(对于 gcc 或其他编译器的类似选项)。

请注意,许多编译器都有一个非标准扩展名 typeof运算符获取对象的类型,这可用于检查两个类型是否相同。

关于在编译时检查宏参数的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11449632/

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