C语言的哪一部分处理类型检查?

时间:2017-10-07 17:39:08

标签: c compiler-construction

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

例如:

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

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

2 个答案:

答案 0 :(得分:3)

  

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

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

记忆中的A"变量"是一个运行时的概念。编译器仅涉及编译时:它将某种语言(源语言)的代码转换为另一种语言(目标语言,通常是汇编代码/机器代码)。它发出指令(执行时)保留内存并使用此内存来存储值。但是在运行时,当程序实际执行时,编译器不再是图片的一部分,因此无法检查任何内容。

在C中,在编译时检查类型。编译器知道文字的类型(例如42int"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.

答案 1 :(得分:0)

每个表达式都有一个类型,最终来自其中出现的变量和文字的类型。 &n的类型为unsigned short*,不能用于初始化int*类型的变量。这与检查内存无关,因此无论变量类型如何,它都可以正常工作。