链接时允许不同的类型

时间:2014-05-25 13:27:47

标签: c linker

我有两个文件。第一个a.c

extern int i;
int main()
{
    i = 5;
    printf("i=%d",i);
}

另一个文件b.c

struct i
{
    int a;
    int b;
}

编译这两个文件并链接它们时,我得到i=5作为输出。

为什么会这样? ia.cb.c中包含了分类型。

2 个答案:

答案 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类型的任何变量。