[問題] include相同.h檔 但.h內容不同

看板C_and_CPP (C/C++)作者 (竹科學友哥)時間5年前 (2020/05/07 19:04), 編輯推噓2(2014)
留言16則, 5人參與, 5年前最新討論串1/1
開發平台(Platform): (Ex: Win10, Linux, ...) Linux 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) Netbeans 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): A.c 有include "A.h" 和 "B.h" B.c 有include "B.h" 分別build出兩個lib是A.so和B.so B.h 有個struct 如下: typedef struct { ULONG ulType; BYTE baIP[20]; USHORT usPort; BYTE baID[100]; BYTE baPWD[100]; BYTE baLocalPath[128]; BYTE baFtpPath[128]; BYTE baPrivateKeyPath[300]; BYTE baPublicKeyPath[300]; long lTimeout; }ftpInfo; 我在B.c 增加上面紅字的部分後,重新build出B.so後 就直接丟進去和A.so一起跑 (A.so沒重build) debug發現原本應該在baPrivateKeyPath印出的值 卻跑到baPublicKeyPath,而且只有尾數幾個字元 我在A.c有sprintf(stInfo.baPrivateKeyPath, "/test/test1/test.key"); 照理說有指定塞值到baPrivateKeyPath 會因為改變了struct的內容後 導致值跑掉嗎? 麻煩了 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 60.250.189.43 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1588849491.A.062.html

05/07 20:22, 5年前 , 1F
A.so 沒重新編譯,對它來說用的是舊的 struct,裡面東
05/07 20:22, 1F

05/07 20:22, 5年前 , 2F
西擺放的位置跟新的不同。程式經過編譯後,對 struct
05/07 20:22, 2F

05/07 20:22, 5年前 , 3F
內的東西的讀寫是透過固定的 offset 去做的,沒在管名
05/07 20:22, 3F

05/07 20:22, 5年前 , 4F
05/07 20:22, 4F

05/07 23:39, 5年前 , 5F
好熟悉的bug 以前寫作業被陰過 de了通宵還是炸裂XD
05/07 23:39, 5F

05/07 23:40, 5年前 , 6F
最後才從朋友那邊猜出解法 你要自己加東西而不重編的
05/07 23:40, 6F

05/07 23:40, 5年前 , 7F
話 一個workaround是加在最後面
05/07 23:40, 7F

05/07 23:40, 5年前 , 8F
這樣才能符合其他人的offset
05/07 23:40, 8F

05/07 23:40, 5年前 , 9F
不過不確定這個符不符合標準就是 感覺就不符
05/07 23:40, 9F

05/07 23:50, 5年前 , 10F
現在想想應該也是當時那個struct的align下剛好可以讓
05/07 23:50, 10F

05/07 23:51, 5年前 , 11F
我塞,塞太多應該不管怎樣都會炸,因為大小不一樣
05/07 23:51, 11F

05/07 23:51, 5年前 , 12F
*弄array之類需要算pointer怎麼加的時候
05/07 23:51, 12F

05/08 00:24, 5年前 , 13F
google "ABI相容"
05/08 00:24, 13F

05/08 09:02, 5年前 , 14F
這就是為什麼要盡量隱藏細節,不讓header透露太多事
05/08 09:02, 14F

05/08 09:04, 5年前 , 15F
而且專案最好是串在一起,編譯的時候整個一起處理
05/08 09:04, 15F

05/08 21:04, 5年前 , 16F
解完bug後有空可以查查pimpl idiom
05/08 21:04, 16F
文章代碼(AID): #1Ui-jJ1Y (C_and_CPP)
文章代碼(AID): #1Ui-jJ1Y (C_and_CPP)