【问题标题】:What part of the C language handles type checking?C 语言的哪一部分处理类型检查?
【发布时间】:2017-10-07 17:39:08
【问题描述】:

语言功能是否允许编译器检查内存中变量的类型,还是仅基于用于变量类型的关键字进行类型检查?

例如:

unsigned short n = 3;
         int *p = &n;

int 和 short 都在内存中使用 4 个字节,但编译器无法将 short * 隐式转换为 int *。在这种情况下,编译器如何知道 n 不是 p 的有效地址?

【问题讨论】:

  • 没有,也没有,也没有。
  • 为什么编译器不能知道呢?它可以具有从变量名到范围类型的映射。
  • 这是解析器的基本职责,是编译器解释语句和生成代码的部分。像 n 和 p 这样的变量出现在符号表中,它描述了它们的类型、大小和地址。处理赋值的解析器部分检查右手表达式类型是否匹配左手左值类型。不匹配的类型和缺少隐式转换使其生成错误消息。

标签: c compiler-construction


【解决方案1】:

语言功能是否允许编译器检查内存中变量的类型,还是仅基于用于变量类型的关键字进行类型检查?

这是一个非常困惑的问题。编译器是实现语言的东西。因此,语言功能可能要求编译器执行某些操作(以使该功能正常工作),但它不允许编译器执行某些操作。 p>

“内存中的变量”是一个运行时概念。编译器仅在编译时参与:它将某种语言(源语言)的代码翻译成另一种语言(目标语言,通常是汇编代码/机器代码)。它发出指令(在执行时)保留内存并使用该内存来存储值。但是在运行时,当程序实际执行时,编译器不再是画面的一部分,所以它什么也做不了。

在 C 语言中,类型在编译时进行检查。编译器知道文字的类型(例如,42 是 int,"hello" 是 char [6]),并且它知道您声明的所有内容的类型(因为它必须解析声明),包括变量。类型检查和类型转换规则与类型的大小无关。

例如:

short int a = 42;
double b = a;  // OK, even though commonly sizeof a == 2 and sizeof b == 8

另一方面:

signed char c;
char *p = &c;  // error, even though commonly char and signed char have the same
               // size, representation, and range of possible values

完全可以在不实际生成任何代码的情况下对 C 进行类型检查。

【讨论】:

  • 感谢您的回答。我不熟悉较低级别的编程概念。您的解释为我澄清和巩固了一些事情。
【解决方案2】:

每个表达式都有一个类型,最终派生自其中出现的变量和文字的类型。 &n 的类型是unsigned short*,不能用于初始化int* 类型的变量。这与检查内存无关,因此它与变量类型以外的上下文无关。

【讨论】:

    猜你喜欢
    • 2013-06-13
    • 2011-03-17
    • 1970-01-01
    • 2011-02-22
    • 2016-04-13
    • 1970-01-01
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多