查看 typedef 是否定义了 C 中的特定类型
Find out if a typedef defines a specific type in C
我必须在 C 中实现链表数据结构。在 "linked_list.h"
头文件中,我有以下行:
typedef int ListDataType;
我的问题是,如果 ListDataType
不等于 int
,我该如何终止程序?我知道如果不满足此要求,预处理器无法阻止我的程序编译(因为它对 typedef
s 一无所知)。
我用 C11 编写代码,我知道 _Generic
关键字。怎样才能避免写出下面这样的东西?
{
ListDataType q;
const bool kListDataTypeIsNotInt = _Generic(q, int: false, default: true);
if (kListDataTypeIsNotInt) {
print_error_message_and_exit("list data types other than int are not supported");
}
}
我应该改用宏 (#define LIST_DATA_TYPE int
) 吗?
代码中的变量将被优化掉,我强烈怀疑优化后此代码将是 100% compile-time。
不过,如果您不确定,可以通过引入宏和静态断言对其进行微调:
#define IS_INT(q) _Generic((q), int: true, default: false)
...
ListDataType q;
_Static_assert(IS_INT(q), "list data types other than int are not supported");
这是 100% compile-time 和良好做法。
我必须在 C 中实现链表数据结构。在 "linked_list.h"
头文件中,我有以下行:
typedef int ListDataType;
我的问题是,如果 ListDataType
不等于 int
,我该如何终止程序?我知道如果不满足此要求,预处理器无法阻止我的程序编译(因为它对 typedef
s 一无所知)。
我用 C11 编写代码,我知道 _Generic
关键字。怎样才能避免写出下面这样的东西?
{
ListDataType q;
const bool kListDataTypeIsNotInt = _Generic(q, int: false, default: true);
if (kListDataTypeIsNotInt) {
print_error_message_and_exit("list data types other than int are not supported");
}
}
我应该改用宏 (#define LIST_DATA_TYPE int
) 吗?
代码中的变量将被优化掉,我强烈怀疑优化后此代码将是 100% compile-time。
不过,如果您不确定,可以通过引入宏和静态断言对其进行微调:
#define IS_INT(q) _Generic((q), int: true, default: false)
...
ListDataType q;
_Static_assert(IS_INT(q), "list data types other than int are not supported");
这是 100% compile-time 和良好做法。