簡體   English   中英

何時以及何時不在 C 中進行類型轉換存在沖突?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM