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

时间:2017-11-22 15:51:17

标签: c gcc typedef

我尝试定义'自然'类型,如:

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不是unsigned int”,我该怎么做才能定义'自然'类型。

额外信息:我“printf”变量natural_index,并打印了值“-10”。我至少预计,另一个正数(不完全是10)。

2 个答案:

答案 0 :(得分:5)

C在两个不同的级别上不支持您要执行的操作。

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

之后
typedef unsigned int nat;

声明

nat natural_index;

100%相当于

unsigned int natural_index;

typedef的重点是什么呢?当基础类型"根据目标架构可能有所不同时,它最有用;例如,标准typedef uint64_t可能是unsigned longunsigned long long的简写,具体取决于体系结构。)

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

natural_index = -10;

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

你的选择是使用一种实际上支持这种事物的语言(例如Ada,Haskell,ML)或写一个" linting"解析C本身并强制执行您希望它强制执行的任何规则的程序(现有示例为lintsparse)。

答案 1 :(得分:2)

你忘了用分号;分隔表达式语句。

natural_index = 10;
natural_index = -10;
在评估赋值运算符-10期间,

=为一个大的带符号数。

来自ISO9899的

6.5.16.1p2(简单分配)说:

  

在简单赋值(=)中,右操作数的值将转换为赋值表达式的类型。

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