我试图定义一个“自然”类型,就像这样:
typedef unsigned int nat;
但是如果我定义一个 nat 变量,该变量的行为就像一个普通的 int:
nat natural_index;
natural_index = 10; // That's what I want.
natural_index = -10; // Still a valid option.
在简历中,我想知道为什么编译器不显示消息,比如 “-10 不是无符号整数”,我可以做些什么来定义“自然”类型。
额外信息:我“打印”了变量 natural_index,并打印了值“-10”。我预计至少还有一个正数(不完全是 10)。
最佳答案
C 在两个不同的层面上不支持您尝试做的事情。
首先,C 中的 typedef
不会创建新的、不同的类型;它只是为原始类型创建一个简写名称。因此,经过
typedef unsigned int nat;
声明
nat natural_index;
100% 等同于
unsigned int natural_index;
(typedef
的意义何在?当“底层类型”可能因目标架构而异时,它最有用;例如,标准 typedef uint64_t
可能是 unsigned long
或 unsigned long long
的简写,具体取决于架构。)
其次,C 没有机制来改变算术表达式是否执行隐式转换。在
natural_index = -10;
赋值运算符会将负数-10
(类型为int
)转换为一个大的无符号数(即(UINT_MAX - 10) + 1
,可能但不一定是 4,294,967,286),并且没有办法禁用它。
你的选择是使用一种真正支持这种东西的语言(例如 Ada、Haskell、ML),或者编写一个“linting”程序来解析 C 本身并强制执行你希望它强制执行的任何规则(现有示例是 lint
和 sparse
)。
关于c - 为什么我尝试用 typedef 定义自然类型不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47438872/