2012-10-31 32 views
0

我不確定這是一個問題,但肯定是一種好奇心。我有一個C DLL,導出一個採用32位整數和布爾(stdbool.h)的函數。導出的函數(stdcall)表示參數列表是8個字節(4字節int,4字節bool)。這個C DLL還包含一個使用布爾值的結構。檢查sizeof(bool)表示1字節布爾值。導出C函數vs結構vs .Net編組bool的大小

我有一個.Net包裝這個本地DLL。編組結構時,我爲每個布爾型字段UnmanagedType.U1指定了一切,並且運行良好,所有內容都正確對齊。我只使用順序佈局,沒有明確的,也沒有任何抵消,也沒有任何包裝。

我的問題是,爲什麼布爾大小的視差?

+0

該DLL使用什麼編譯器? – Lundin

+0

Eclipse - > MingW - > GCC 4.7 – Ioan

回答

0

C中小於「int」的所有函數參數都會在調用中轉換爲「int」大小。這是因爲每個參數都分別放在堆棧上(在大多數體系結構中),所以它們被轉換爲通常等於「int」大小的堆棧單元大小。

至於結構 - 沒有任何轉換。儘管我們不應該忘記結構中的對齊。但這是另一回事。

+0

儘管許多實現可能,但語言並不要求這樣做。 –

+0

@KeithThompson如果函數原型丟失,語言確實需要它。然後發生默認參數促銷,將所有小整數提升爲int。雖然在這個特定情況下是否缺少原型,但我們不知道。 – Lundin

+0

@Lundin是的,原型存在於這種情況下。 – Ioan