为什么我尝试用 typedef 定义自然类型不起作用?

Why my attempt to define a natural type with typedef doesn't work?

我试图定义一个 'natural' 类型,像这样:

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' 类型。

额外信息:我"printf"变量natural_index,打印了值'-10'。我至少期望另一个正数(不完全是 10)。

您忘记用分号分隔表达式语句 ;

natural_index = 10;
natural_index = -10;

-10 在赋值运算符 =.

求值期间到一个大的有符号数

6.5.16.1p2(简单赋值)来自 ISO9899 说:

In simple assignment (=), the value of the right operand is converted to the type of the assignment expression.

当您使用存储 class 说明符 typedef 时,这会告诉解析器在解析器的环境中为类型 unsigned int 添加别名标识符 nat或者在它输出的解析树中。在这种情况下,nat 将被评估为声明中的类型,因此当您声明具有标识符 natural_index 的对象时,与该对象关联的左值将具有类型 unsigned int

C 在两个不同的层面上不支持您尝试做的事情。

首先,C 中的 typedef 不会创建新的不同类型;它只是为原始类型创建一个 shorthand 名称。因此,在

之后
typedef unsigned int nat;

宣言

nat natural_index;

100% 等同于

unsigned int natural_index;

(那么 [=14= 的意义何在?当 "underlying type" 可能因目标架构而异时最有用;例如,标准 typedef uint64_t 可能是 shorthand 用于 unsigned longunsigned long long,具体取决于架构。)

其次,C 没有改变算术表达式是否执行隐式转换 的机制。在

natural_index = -10;

赋值运算符会将负数-10(类型int)转换为一个大的无符号数(即(UINT_MAX - 10) + 1,可能但不一定是4,294,967,286)在此过程中,无法禁用它。

你的选择是使用一种真正支持这种东西的语言(例如 Ada、Haskell、ML)或者编写一个 "linting" 程序来解析 C 本身并执行任何规则您希望它强制执行(现有示例是 lintsparse)。