【发布时间】:2016-04-01 08:24:54
【问题描述】:
有没有办法让 C 更加了解类型并确保类型安全?
考虑一下:
typedef unsigned cent_t;
typedef unsigned dollar_t;
#define DOLLAR_2_CENT(dollar) ((cent_t)(100*(dollar)))
void calc(cent_t amount) {
// expecting 'amount' to semantically represents cents...
}
int main(int argc, char* argv[]) {
dollar_t amount = 50;
calc(DOLLAR_2_CENT(amount)); // ok
calc(amount); // raise warning
return 0;
}
有没有办法让上面的代码至少引起 gcc 的警告?
我知道我可以使用 C-structs 来包装 unsigneds 并达到预期的结果,我只是想知道是否有更优雅的方法来做到这一点。
还能再多一点吗?
【问题讨论】:
-
使
cent_t和dollar_t成为一个结构,只有一个成员? -
C 并不是真正的类型安全语言。 模拟类型安全的最简单方法是使用结构。
-
在使用前正确声明所有函数(函数参数的完整列表等)。传递结构而不是基本类型(或基本类型的 typedef)。比宏更喜欢内联函数。在编译器上调高警告级别。
-
我相信splint 可以检查这一点。可能还有其他编译器或静态分析工具也可以。
-
声明钱使用无符号类型不是一个好主意。当你超支时,它可能会给你一种虚假的财富感。
标签: c type-safety