有没有办法强制对相同类型的 typedef 进行显式转换?我必须处理 utf8,有时我会对字符数和字节数的索引感到困惑。所以这很好...
有没有办法强制对相同类型的 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)可以做到这一点。
编辑 我仍然不太喜欢匈牙利表示法。由于项目编码约定,我无法将其用于这个问题,但我现在在另一个类似的情况下使用它,其中类型相同,含义非常相似。而且我必须承认:它很有帮助。我永远不会去用 \'i\' 开头声明每个整数,但正如 Joel 的重叠类型示例一样,它可以救命。
对于“句柄”类型(不透明指针),Microsoft 使用声明结构然后 typedef 指向该结构的指针的技巧:
#define DECLARE_HANDLE(name) struct name##__ { int unused; }; \
typedef struct name##__ *name
然后而不是
typedef void* FOOHANDLE;
typedef void* BARHANDLE;
他们确实:
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! */