4
由於痛飲無法解析一些C的結構,我想包住__attribute__((packed))
,我解決此通過把一個忽略__attribute __((packed))在SWIG接口中始終安全嗎?
#define __attribute__(x)
在我.i
文件。
這會來咬我嗎?
由於痛飲無法解析一些C的結構,我想包住__attribute__((packed))
,我解決此通過把一個忽略__attribute __((packed))在SWIG接口中始終安全嗎?
#define __attribute__(x)
在我.i
文件。
這會來咬我嗎?
這實際上是完全理智的。爲了能夠生成正確的代碼,SWIG不需要知道任何關於要包裝的struct
的佈局。 (甚至不需要知道它們包含的所有成員)。
其原因是生成的代碼很大程度上只是編組數據。在C語言中,你可以合法地寫:
void show_a(const struct foo *instance) {
printf("%s", instance->b);
}
不管foo
被定義爲:
struct foo {
double a;
char *b;
}
或
struct foo {
char *b;
double a,c;
int xyz;
}
在包裝/對齊問題是當創建新的唯一的地方結構。如果你不從C編譯器本身隱藏屬性,這個處理也是正確的,因爲生成的C wrapper代碼將使用真實的定義,而不是你在界面文件中顯示的僞定義。
這有點笨拙,但你可以通過閱讀生成的包裝來根據需要說服自己。
一般的答案是,你可以對SWIG本身說謊很多,當C編譯器看到生成的代碼並且將其與真實的定義/聲明進行協調時,它們最終都能正常工作。
在具體的情況下,簡短的答案是:只要你把那個#define
放在.i文件中,然後只在一個沒有傳遞到你生成的module_wrap.c的地方,你沒關係。
「不要隱藏C的屬性」 - 這意味着'#define'可以在由SWIG解析的'.i'文件的部分中,但是如果我(意外地)放入它在'%{...%}'塊內,對嗎? – Dave
@準確地說。 – Flexo