c - 如何断言两种类型在c中是相等的?

标签 c types assert

我如何在 C 语言中断言两种类型相等?在 C++ 中,我会使用 std::is_same,但搜索 StackOverflow 和其他地方似乎只给出 C++ 和 C# 的结果。在 C 中没有办法做到这一点吗?


请注意,这不是询问变量是否具有特定类型,而是询问两种类型是否相同。

最佳答案

How to assert two types are equal in c?

使用 _Generic 至少可以让您在大多数情况下使用非数组类型。

#define compare_types(T1, T2) _Generic((  (T1){0}  ), \
  T2: "Same", \
  default: "Different" \
)

#include <stdio.h>
#include <stdint.h>

int main() {
  // Same range
  printf("%ld %lld\n", LONG_MAX, LLONG_MAX);
  // Same size
  printf("%zu %zu\n", sizeof (long), sizeof (long long));
  // Yet different
  printf("%s\n", compare_types(long, long long));

  // int64_t is a long on my machine
  printf("%s\n", compare_types(long, int64_t));
  printf("%s\n", compare_types(long long, int64_t));
}

输出

9223372036854775807 9223372036854775807
8 8
Different
Same
Different

改进

此外,更强的比较采用了 A vs BB vs A 测试。这 2 个测试对于 _Generic 的控制表达式很有用,将数组转换为丢失某些类型信息的第一个元素的指针。

#define strong_helper(T1, T2) _Generic(( (T1){0} ), \
  T2: 1, \
  default: 0 \
)
#define compare_types_strong(T1, T2) (strong_helper(T1,T2) && strong_helper(T2,T1))

printf("%d\n", compare_types_strong(long, int64_t));
printf("%d\n", compare_types_strong(int [3], int *));

输出

1
0

数组和void还是很麻烦

compare_types_strong(int [3], int [3]) 返回 0,因为 _Generic 将控制表​​达式 int [3] 转换为指向第一个元素类型 (int *) 的指针。

@PSkocik ,在已删除的评论中指出此方法不适用于 incomplete object type void .

关于c - 如何断言两种类型在c中是相等的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53840498/

相关文章:

c - C 中的浮点与整数数据类型计算问题

java - 使用 Java 断言是否适合验证 JPA 实现

c++ - 断言不起作用

c - 列出 C 中的目标目录

c - 计算带前导零的数字总和时 C 中的奇怪行为

swift - 以更快速的方式从 Any Object 确定 Swift 对象类型

python - 如何检查对象是列表还是元组(但不是字符串)?

c - 使用 C 的内存分配、分发和缓存 - Memcached

c - array[] 存储 > char,如何使用

types - 如果 Kotlin 中的类型参数受另一个类型参数的限制,为什么它不能有任何其他范围?