[問題] c語言 重複定義編譯錯誤

看板C_and_CPP (C/C++)作者 (komo)時間2周前 (2026/03/28 01:30), 2周前編輯推噓7(7013)
留言20則, 6人參與, 2周前最新討論串1/1
開發平台(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://www.ptt.cc/bbs/C_and_CPP/M.1774632623.A.3AB.html ※ 編輯: komododo (36.228.124.9 臺灣), 03/28/2026 01:33:10

03/28 07:32, 2周前 , 1F
拆成兩個.c各自參考不同的macro避免命名衝突(非專業
03/28 07:32, 1F

03/28 08:52, 2周前 , 2F
macro copy 出來用
03/28 08:52, 2F

03/28 09:24, 2周前 , 3F
如果能找得到 a.h 跟 b.h 的作者, 去找他(們)改
03/28 09:24, 3F

03/28 09:26, 2周前 , 4F
以這兩個都有 struct person 來看它們應該是同一或相關系統
03/28 09:26, 4F

03/28 09:26, 2周前 , 5F
的標頭檔, 應該會有不小機會是同一作者
03/28 09:26, 5F

03/28 09:27, 2周前 , 6F
那就把你遇到的這個狀況跟那個作者說請他改
03/28 09:27, 6F
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

03/28 11:45, 2周前 , 7F
會同時使用嗎? 不會的話用#if遮蔽其中一方程序
03/28 11:45, 7F
typedef struct person不會同時使用,只會用到b.h定義的,但是a.h和b.h都有其他要用到 的struct 和macro,必須同時引用

03/28 13:00, 2周前 , 8F
那只能改用 C++ 用 namespace 包起來了 (x
03/28 13:00, 8F
※ 編輯: komododo (36.228.124.9 臺灣), 03/28/2026 18:17:15

03/28 21:29, 2周前 , 9F
typedef成不同pointer/pimpl
03/28 21:29, 9F

03/29 00:13, 2周前 , 10F
#define person person_a
03/29 00:13, 10F

03/29 00:13, 2周前 , 11F
#include "a.h"
03/29 00:13, 11F

03/29 00:13, 2周前 , 12F
#undef person
03/29 00:13, 12F

03/29 00:13, 2周前 , 13F
#include "b.h"
03/29 00:13, 13F

03/29 14:53, 2周前 , 14F
自訂另一個opaque type實作放在別的source,所有function
03/29 14:53, 14F

03/29 14:53, 2周前 , 15F
自己包
03/29 14:53, 15F

04/01 21:42, 2周前 , 16F
> 都沒權限改: 所以我才說去找原作者叫他改
04/01 21:42, 16F

04/01 21:42, 2周前 , 17F
去找原作者把你的衝突問題跟他說要他改
04/01 21:42, 17F

04/01 21:44, 2周前 , 18F
如果這兩個真的是同一系列東西裡的兩個地方的標頭檔
04/01 21:44, 18F

04/01 21:44, 2周前 , 19F
你不會是第一個也不會是最後一個把兩個放在一起用的人
04/01 21:44, 19F

04/01 21:44, 2周前 , 20F
光這一點你就有理由去叫原作者改了
04/01 21:44, 20F
感謝回答! ※ 編輯: komododo (36.228.69.213 臺灣), 04/02/2026 00:05:15
文章代碼(AID): #1fnhwlEh (C_and_CPP)
文章代碼(AID): #1fnhwlEh (C_and_CPP)