首页 > 解决方案 > 范围内的结构与函数定义

问题描述

所以,据我所知,这在 C 中是合法的:

foo.c

struct foo {
   int a;
};

酒吧.c

struct foo {
    char a;
};

但同样的功能是非法的:

foo.c

int foo() {
    return 1;
}

酒吧.c

int foo() {
    return 0;
}

并且会导致链接错误(函数的多重定义foo)。

这是为什么?结构名称和函数名称之间有什么区别使 C 无法处理一个而不能处理另一个?这种行为是否也扩展到 C++?

标签: c++clinkage

解决方案


这是为什么?

struct foo {
   int a;
};

定义用于创建对象的模板。它不创建任何对象或函数。除非struct foo在代码中的某处使用,就编译器/链接器而言,这些代码行也可能不存在。

请注意,C 和 C++ 处理不兼容struct定义的方式有所不同。

struct foo只要您不混合使用它们,您发布的代码中的不同定义在 C 程序中是可以的。

但是,它在 C++ 中是不合法的。在 C++ 中,它们具有外部链接,并且必须以相同的方式定义。更多细节参见3.2 一个定义规则/5


推荐阅读