在 C 中强制执行强类型检查(typedef 的类型严格性)

2023-12-03

有没有办法对相同类型的 typedef 强制执行显式强制转换?我必须处理 utf8,有时我会对字符计数和字节计数的索引感到困惑。所以最好有一些 typedef:

typedef unsigned int char_idx_t;
typedef unsigned int byte_idx_t;

另外,您需要在它们之间进行显式转换:

char_idx_t a = 0;
byte_idx_t b;

b = a; // compile warning
b = (byte_idx_t) a; // ok

我知道 C 中不存在这样的功能,但也许您知道一个技巧或编译器扩展(最好是 gcc)可以做到这一点。


EDIT总的来说,我仍然不太喜欢匈牙利符号。由于项目编码约定,我无法使用它来解决这个问题,但我现在在另一个类似的情况下使用它,其中类型也相同,含义也非常相似。我必须承认:这很有帮助。我永远不会去声明每个以“i”开头的整数,但正如 Joel 的重叠类型示例中那样,它可以挽救生命。


对于“句柄”类型(不透明指针),微软使用声明结构然后 typedef 指向该结构的指针的技巧:

#define DECLARE_HANDLE(name) struct name##__ { int unused; }; \
                             typedef struct name##__ *name

然后代替

typedef void* FOOHANDLE;
typedef void* BARHANDLE;

They do:

DECLARE_HANDLE(FOOHANDLE);
DECLARE_HANDLE(BARHANDLE);

所以现在,这有效:

FOOHANDLE make_foo();
BARHANDLE make_bar();
void do_bar(BARHANDLE);

FOOHANDLE foo = make_foo();  /* ok */
BARHANDLE bar = foo;         /* won't work! */
do_bar(foo);                 /* won't work! */   
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C 中强制执行强类型检查(typedef 的类型严格性) 的相关文章

随机推荐