作者komododo (komo)
看板C_and_CPP
标题[问题] c语言 重复定义编译错误
时间Sat Mar 28 01:30:21 2026
开发平台(Platform): (Ex: Win10, Linux, ...) Win10
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)GCC
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
问题(Question):
想请教一个专案遇到编译错误的问题:
有三个文件
a.h
定义一个结构 typedef struct person
定义一个巨集 define macro1
b.h
定义一个结构 typedef struct person
定义一个巨集 define macro2
main.c
必须用到macro1和macro2
所以include a.h和b.h
这时候编译会遇到struct redefinition error
但是a.h和b.h都是别人写好的,内容不能改
想请问这样要怎麽解决?谢谢
喂入的资料(Input):
预期的正确结果(Expected Output):
错误结果(Wrong Output):
程式码(Code):(请善用置底文网页, 记得排版,禁止使用图档)
补充说明(Supplement):
----
Sent from
BePTT on my Samsung SM-S9480
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 36.228.124.9 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1774632623.A.3AB.html
※ 编辑: komododo (36.228.124.9 台湾), 03/28/2026 01:33:10
1F:→ hongsiangfu: 拆成两个.c各自参考不同的macro避免命名冲突(非专业03/28 07:32
2F:推 Lipraxde: macro copy 出来用03/28 08:52
3F:推 LPH66: 如果能找得到 a.h 跟 b.h 的作者, 去找他(们)改03/28 09:24
4F:推 LPH66: 以这两个都有 struct person 来看它们应该是同一或相关系统03/28 09:26
5F:→ LPH66: 的标头档, 应该会有不小机会是同一作者03/28 09:26
6F:→ LPH66: 那就把你遇到的这个状况跟那个作者说请他改03/28 09:27
1. 不好拆成两个.c,main.c include a.h和b.h,但typedef struct person是定义在a.h和
b.h里又include好几层的某一个c.h里面
2. a.h 和b.h 里面main.c要用到的macro和struct太多,copy不太合适
3. a.h和b.h我都没权限改QQ
感谢回覆~
※ 编辑: komododo (36.228.124.9 台湾), 03/28/2026 10:46:17
7F:→ hongsiangfu: 会同时使用吗? 不会的话用#if遮蔽其中一方程序03/28 11:45
typedef struct person不会同时使用,只会用到b.h定义的,但是a.h和b.h都有其他要用到
的struct 和macro,必须同时引用
8F:→ Lipraxde: 那只能改用 C++ 用 namespace 包起来了 (x03/28 13:00
※ 编辑: komododo (36.228.124.9 台湾), 03/28/2026 18:17:15
9F:推 johnjohnlin: typedef成不同pointer/pimpl03/28 21:29
10F:推 akasan: #define person person_a03/29 00:13
11F:→ akasan: #include "a.h"03/29 00:13
12F:→ akasan: #undef person03/29 00:13
13F:→ akasan: #include "b.h"03/29 00:13
14F:推 wulouise: 自订另一个opaque type实作放在别的source,所有function03/29 14:53
15F:→ wulouise: 自己包03/29 14:53
16F:推 LPH66: > 都没权限改: 所以我才说去找原作者叫他改04/01 21:42
17F:→ LPH66: 去找原作者把你的冲突问题跟他说要他改04/01 21:42
18F:→ LPH66: 如果这两个真的是同一系列东西里的两个地方的标头档04/01 21:44
19F:→ LPH66: 你不会是第一个也不会是最後一个把两个放在一起用的人04/01 21:44
20F:→ LPH66: 光这一点你就有理由去叫原作者改了04/01 21:44
感谢回答!
※ 编辑: komododo (36.228.69.213 台湾), 04/02/2026 00:05:15