C代码移植到C++报错struct header_t无成员's'如何修复
错误原因
C和C++对struct/union标签的命名空间规则存在差异,直接导致了该报错:
- C语言中struct/union/enum的标签和typedef别名、变量名属于独立的命名空间,因此你代码中先定义
struct header_t、后续又将union类型typedef为header_t的写法完全合法,二者互不干扰。C环境下显式写struct header_t时指向你最初定义的结构体,直接写header_t时指向typedef后的union类型。 - C++中struct/union/enum的标签会和普通标识符共用同一命名空间,你代码中先定义
struct header_t后,header_t已经默认指代该结构体,后续的重名typedef会导致命名冲突。即使编译器放过了重定义问题,你代码中使用struct header_t类型的变量时,也只会指向最初定义的、没有s成员的结构体,因此抛出成员不存在的报错。
修复方案
你代码中最初定义的struct header_t属于冗余定义,和后续union内部的结构体定义功能重复,最简单的修复方式是直接删除该冗余定义,修改后的完整代码如下:
typedef char ALIGN[16]; union header { struct { size_t size; unsigned is_free; union header *next; } s; ALIGN stub; }; typedef union header header_t; header_t *head, *tail; ...
如果确实需要保留最初的struct header_t定义,只需要修改两个重名类型的命名,避免struct标签和typedef别名重名即可,不需要改动其他逻辑。
内容的提问来源于stack exchange,提问作者nad34
相关产品推荐
相关产品推荐

