结构体与作用域中的函数定义

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (32)

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

foo.c

struct foo {
   int a;
};

bar.c

struct foo {
    char a;
};

但与功能相同的事情是非法的:

foo.c

int foo() {
    return 1;
}

bar.c

int foo() {
    return 0;
}

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

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

提问于
用户回答回答于

你的函数定义都声明一个被foo外部链接调用的实体,并且C标准说,不能有多于一个具有外部链接的实体的定义。定义的结构类型不是具有外部链接的实体,因此可以有多个定义struct foo

如果使用相同的名称声明了具有外部链接的对象,那么这将是一个错误:

foo.c的

struct foo {
   int a;
};
struct foo obj;

bar.c

struct foo {
    char a;
};
struct foo obj;

现在你有两个叫做对象的对象obj都有外部链接,这是不允许的。

即使其中一个对象只声明了,但没有定义,它仍然是错误的:

foo.c

struct foo {
   int a;
};
struct foo obj;

bar.c

struct foo {
    char a;
};
extern struct foo obj;

这是未定义的,因为两个声明obj引用了同一个对象,但它们没有兼容类型(因为struct foo在每个文件中定义不同)。

C ++具有类似但更复杂的规则来说明inline函数和inline变量,模板以及其他C ++特性。在C ++中,相关要求被称为单定义规则(或ODR)。一个明显的区别是C ++甚至不允许使用两种不同的struct定义,即使它们从未用于声明具有外部链接的对象或以其他方式在翻译单元之间“共享”。

热门问答

使用文档遇到问题,可以找谁处理?

请叫我雷锋!腾讯云文档有“文档反馈”的功能,直接在文档页面就可以反馈,反馈还有 礼品 ~ 云+社区:问答.png ... 展开详请

直播间IM消息可以下载到自己服务器备份吗?

人生的旅途辣鸡前端
推荐
目前仅私有群(Private)、公开群(Public)和聊天室(ChatRoom)具备消息漫游能力(默认7天)。核实下您那边的群组类型看是否支持https://cloud.tencent.com/document/product/269/1502#.E6.B6.88.E6.81....... 展开详请

腾讯云容器加速地址是错的?

推荐已采纳

我刚才测试了一下,这个加速器地址可以用额,你这边是怎么测试出是关闭状态的啊?

加速器地址是不能直接用浏览器访问的,阿里云提供的直接访问也是空

webIM添加组员报错?

无聊至极互联网重度用户
推荐已采纳

付费超过组数限制,核实下是否超过限制

https://cloud.tencent.com/document/product/269/11673#.E5.8A.9F.E8.83.BD.E5.AF.B9.E6.AF.94

Tencent iot-sdk-embedded-c在Windows下编译出错:无法解析外部符号?

无聊至极互联网重度用户
推荐已采纳

腾讯云IM调用 add_group_member提示该群不能邀请成员?

推荐已采纳
是什么类型的群?根据相应类型的邀请他人入群的控制项,对照文档看下是否允许邀请他人入群。 参考文档:https://cloud.tencent.com/document/product/269/1502#.E7.BE.A4.E6.88.90.E5.91.98.E6.93.8D.E4...... 展开详请

所属标签

扫码关注云+社区

领取腾讯云代金券