我有两个文件。第一个a.c
有
extern int i;
int main()
{
i = 5;
printf("i=%d",i);
}
另一个文件b.c
有
struct i
{
int a;
int b;
}
编译这两个文件并链接它们时,我得到i=5
作为输出。
为什么会这样? i
在a.c
和b.c
中包含了分类型。
答案 0 :(得分:1)
在C中,相同标识符的不同出现可能有所不同 同一个编译单元中的类型(从不介意链接)。这个 程序很好:
#include <stdio.h>
struct i
{
int i;
};
static int i;
int main(void)
{
i = 1;
struct i ii;
ii.i = i;
printf("%d\n",ii.i);
return 0;
}
根据C99,结构标记和变量名称位于不同的名称空间中 标准:
6.2.3标识符的名称空间
如果在a中的任何一点可以看到多个特定标识符的声明 在翻译单元中,句法上下文消除了引用不同实体的用法。 因此,各种标识符类别都有单独的名称空间,如下所示:
- 标签名称(通过标签声明和使用的语法消除歧义);
- 结构,联合和枚举的标记(通过遵循任何方式消除歧义 关键字struct,union或enum);
- 结构或工会的成员;每个结构或联合都有一个单独的名称 其成员的空间(通过用于访问的表达式的类型消除歧义 会员通过。或 - &gt;操作者);
- 所有其他标识符,称为普通标识符(在普通声明符中声明或作为 枚举常量)。
(该程序也是合法的C ++,为<stdio.h>
交换<cstdio>
)
答案 1 :(得分:0)
因为我在a.c中声明了将要发生的事情,所以&#34; b.c&#34;无法删除a.c文件中的内容,尤其是因为您没有声明i类型的任何变量。