如何在C中断言两种类型相等?

时间:2018-12-18 20:23:21

标签: c types assert

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


注意,这不是在问变量是否具有某种类型,而是两种类型是否相同。

2 个答案:

答案 0 :(得分:3)

  

如何在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测试。这两个测试对于_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

答案 1 :(得分:2)

在gcc下,您可以执行以下操作:

#define same_type(a, b) \ 
    static_assert(__builtin_types_compatible_p(typeof(a), typeof(b)), "types do not match")

...

int a, b;
float c;
same_type(a,b);
same_type(a,c);