2013-07-26 48 views

回答

4

這實際上是完全理智的。爲了能夠生成正確的代碼,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的地方,你沒關係。

+0

「不要隱藏C的屬性」 - 這意味着'#define'可以在由SWIG解析的'.i'文件的部分中,但是如果我(意外地)放入它在'%{...%}'塊內,對嗎? – Dave

+0

@準確地說。 – Flexo

相關問題