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

标签 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 不是无符号整数”,我可以做些什么来定义“自然”类型。

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

最佳答案

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)。

关于c - 为什么我尝试用 typedef 定义自然类型不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47438872/

相关文章:

iphone - 在 Xcode 4.2 和 iOS SDK 5.0 中使用 gcc 4.2

c++ - 在 C++ 中创建 Typedef

c++ - 显式调用 typedef 类类型的析构函数的正式正确方法

c - 如何使用 C 语言中的文件编写凯撒密码加密代码

c - 使用 C 将整数转换为其二进制表示形式?

c - 如何将此数字表示形式转换为 float ?

c - 旋转矩形阵列45度

python - 如何在alpine容器中安装python2.6?

c - 字符串转换宏

c - 不兼容的指针类型错误 C