[英]conflicted on when and when not to typecast in C?
我在此處和此處閱讀有關搜索和排序功能的 GLibC 參考,在其中一個代碼示例中,使用了類型轉換,而在另一個示例中則不是:
第一:
int
compare_doubles (const void *a, const void *b)
{
const double *da = (const double *) a;
const double *db = (const double *) b;
return (*da > *db) - (*da < *db);
}
第二個:
int
critter_cmp (const void *v1, const void *v2)
{
const struct critter *c1 = v1;
const struct critter *c2 = v2;
return strcmp (c1->name, c2->name);
}
在第二個示例中,是否有任何原因,例如
const struct critter *c1 = (const struct critter *)v1;
沒用過? 或者這只是為了簡潔?
編輯:如果編譯器可以推斷出它,那么在第一個示例中是否需要強制轉換? 這種事情有什么最佳實踐嗎?
與void *
和任何對象指針類型之間的轉換可以安全地完成,而無需進行強制轉換。 這在C 標准的第 6.3.2.3p1 節中指定:
指向
void
的指針可以與指向任何對象類型的指針相互轉換。 指向任何對象類型的指針都可以轉換為指向void
的指針,然后再返回; 結果應與原始指針相等。
因此,第二個函數就可以了,第一個函數可以安全地寫為:
int
compare_doubles (const void *a, const void *b)
{
const double *da = a;
const double *db = b;
return (*da > *db) - (*da < *db);
}
作為一般規則,除非絕對必要,否則不應強制轉換。
不需要,因為void *
可以轉換為任何指針類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.