代码之家  ›  专栏  ›  技术社区  ›  Felix

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

  •  0
  • Felix  · 技术社区  · 8 年前

    我试图定义一种“自然”类型,比如:

    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不是无符号int”,我该怎么定义“自然”类型呢。

    额外信息 :I“printf”变量natural_index,并打印值“-10”。我希望至少还有一个正数(不完全是10)。

    2 回复  |  直到 8 年前
        1
  •  5
  •   zwol    8 年前

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

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

    typedef unsigned int nat;
    

    宣言

    nat natural_index;
    

    等于100%

    unsigned int natural_index;
    

    (这有什么意义 类型定义 然后当“底层类型”可能因目标架构而异时,它最有用;例如,标准typedef uint64_t 可能是 unsigned long unsigned long long 取决于架构。)

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

    natural_index = -10;
    

    -10 (带类型 int )到一个大的无符号数(即 (UINT_MAX - 10) + 1

    你的选择是使用一种实际支持这类事情的语言(例如Ada、Haskell、ML),或者编写一个“linting”程序来解析C本身,并强制执行你希望它强制执行的任何规则(现有示例包括 lint sparse ).

        2
  •  2
  •   alinsoar    8 年前

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

    natural_index = 10;
    natural_index = -10;
    

    -10 在赋值运算符求值期间,将其转换为较大的有符号数 = .

    6.5.16.1p2 ISO9899中的(简单赋值)表示:

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

    使用存储类说明符时 typedef ,这告诉解析器添加别名标识符 nat 对于类型 unsigned int 在解析器的环境中或在其输出的解析树中。在这种情况下 纳特 将在声明中计算为类型,因此当您使用标识符声明对象时 natural_index ,与此对象关联的左值的类型为 无符号整型 .