作者renmax (竹科学友哥)
看板C_and_CPP
标题[问题] include相同.h档 但.h内容不同
时间Thu May 7 19:04:49 2020
开发平台(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://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1588849491.A.062.html
1F:→ Lipraxde: A.so 没重新编译,对它来说用的是旧的 struct,里面东 05/07 20:22
2F:→ Lipraxde: 西摆放的位置跟新的不同。程式经过编译後,对 struct 05/07 20:22
3F:→ Lipraxde: 内的东西的读写是透过固定的 offset 去做的,没在管名 05/07 20:22
4F:→ Lipraxde: 称 05/07 20:22
5F:推 a58524andy: 好熟悉的bug 以前写作业被阴过 de了通宵还是炸裂XD 05/07 23:39
6F:→ a58524andy: 最後才从朋友那边猜出解法 你要自己加东西而不重编的 05/07 23:40
7F:→ a58524andy: 话 一个workaround是加在最後面 05/07 23:40
8F:→ a58524andy: 这样才能符合其他人的offset 05/07 23:40
9F:→ a58524andy: 不过不确定这个符不符合标准就是 感觉就不符 05/07 23:40
10F:→ a58524andy: 现在想想应该也是当时那个struct的align下刚好可以让 05/07 23:50
11F:→ a58524andy: 我塞,塞太多应该不管怎样都会炸,因为大小不一样 05/07 23:51
12F:→ a58524andy: *弄array之类需要算pointer怎麽加的时候 05/07 23:51
13F:→ fatrabitree: google "ABI相容" 05/08 00:24
14F:→ eye5002003: 这就是为什麽要尽量隐藏细节,不让header透露太多事 05/08 09:02
15F:→ eye5002003: 而且专案最好是串在一起,编译的时候整个一起处理 05/08 09:04
16F:推 ko27tye: 解完bug後有空可以查查pimpl idiom 05/08 21:04