C 中的名称绑定

Name binding in C

这更多是理论上的 question.Is 可以将多个名称绑定到单个对象吗?(在堆栈或堆内存中)。我知道指针实际上不被视为绑定,因为已分配值是内存地址。

驻留在堆中的对象只能作为分配函数返回的指针使用,因此绑定并不真正适用于此类对象,很明显多个指针可以指向同一个对象。

使用自动存储定义的对象,又名在堆栈上,不能有多个绑定,因为每个对象定义定义一个标识符。 union 对象的部分可以别名相同的内存区域,并且可以通过不同的成员引用,但同样,也不是完全绑定。

全局对象(数据或代码)具有相同的限制,但链接器可能会将不同的名称映射到同一位置,因此可能会为同一对象创建不同的绑定,可能具有不同的类型。这些通常称为 aliases 并且可以使用编译器特定的编译指示和属性进行控制。这主要用于库函数,超出了 C 标准的范围,其中术语 binding 未定义,也未用于此目的。

如果编译器不知道这些别名,它可能会假设用不同名称定义的对象不会互相使用别名,因此生成的代码可能会产生意外结果。

在 C 中,一个对象是:

region of data storage in the execution environment, the contents of which can represent values (§3.5) Thus,

union {
    int a;
    int b;
} u;

u.au.b 绑定到同一个对象。 (两个名称恰好具有相同的类型,但这不是必需的。)

我们可以争论 ab 是否严格来说是绑定,但标准似乎说它们是:

An identifier can denote an object; a function; a tag or a member of a structure, union, or enumeration; a typedef name; a label name; a macro name; or a macro parameter.