为什么我尝试用 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 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
)。
我试图定义一个 '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 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
)。