作者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/m.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