4 回答

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超4個(gè)贊
C沒有提供語言工具來執(zhí)行此操作-您必須自己做,并逐個(gè)成員比較每個(gè)結(jié)構(gòu)。

TA貢獻(xiàn)1735條經(jīng)驗(yàn) 獲得超5個(gè)贊
您可能會想使用memcmp(&a, &b, sizeof(struct foo))
,但可能并非在所有情況下都可以使用。編譯器可以向結(jié)構(gòu)中添加對齊緩沖區(qū)空間,并且不能保證在緩沖區(qū)空間中位于內(nèi)存位置的值是任何特定值。
但是,如果使用calloc
或memset
結(jié)構(gòu)的使用之前的全尺寸,你可以做一個(gè)淺用的比較memcmp
(如果您的結(jié)構(gòu)中包含指針,它只會匹配,如果指針指向的地址是相同的)。

TA貢獻(xiàn)1872條經(jīng)驗(yàn) 獲得超4個(gè)贊
由于結(jié)構(gòu)中字段之間可能存在隨機(jī)填充字符,因此無法使用memcmp比較結(jié)構(gòu)是否相等。
// bad
memcmp(&struct1, &struct2, sizeof(struct1));
上面對于這樣的結(jié)構(gòu)將失?。?/p>
typedef struct Foo {
char a;
/* padding */
double d;
/* padding */
char e;
/* padding */
int f;
} Foo ;
為了安全起見,您必須使用逐成員比較。

TA貢獻(xiàn)1789條經(jīng)驗(yàn) 獲得超10個(gè)贊
在一般情況下,必須編寫顯式比較函數(shù)。
在以下情況下可以使用memcmp
:
這些結(jié)構(gòu)不包含可能是的浮點(diǎn)字段
NaN
。該結(jié)構(gòu)不包含填充(
-Wpadded
與clang一起使用以檢查此內(nèi)容),或者在初始化時(shí)使用顯式初始化這些結(jié)構(gòu)memset
。沒有成員類型(例如Windows
BOOL
)具有不同但等效的值。
除非您為嵌入式系統(tǒng)編程(或編寫可能在其上使用的庫),否則我不會擔(dān)心C標(biāo)準(zhǔn)中的一些特殊情況。在任何32位或64位設(shè)備上都不存在近與遠(yuǎn)指針區(qū)別。據(jù)我所知,沒有一個(gè)非嵌入式系統(tǒng)具有多個(gè)NULL
指針。
另一種選擇是自動生成相等函數(shù)。如果以簡單的方式布置結(jié)構(gòu)定義,則可以使用簡單的文本處理來處理簡單的結(jié)構(gòu)定義。您可以將libclang用于一般情況-由于它使用的前端與Clang相同,因此它可以正確處理所有極端情況(排除錯誤)。
我還沒有看到這樣的代碼生成庫。但是,它看起來相對簡單。
但是,在這種情況下,此類生成的相等函數(shù)通常在應(yīng)用程序級別執(zhí)行錯誤的操作。例如,應(yīng)該UNICODE_STRING
淺淺或深淺地比較Windows中的兩個(gè)結(jié)構(gòu)?
- 4 回答
- 0 關(guān)注
- 549 瀏覽
添加回答
舉報(bào)