我试图(以我的C#背景)理解以下断言如何为msf_s工作:

https://github.com/ShiftMediaProject/libcdio/blob/master/lib/driver/sector.c#L66

cdio_assert (msf != 0);


https://github.com/ShiftMediaProject/libcdio/blob/master/lib/driver/cdio_assert.h#L50

#define cdio_assert(expr) \
 assert(expr)


https://github.com/ShiftMediaProject/libcdio/blob/master/include/cdio/types.h#L217

  PRAGMA_BEGIN_PACKED
  struct msf_s {
    uint8_t m, s, f; /* BCD encoded! */
  } GNUC_PACKED;
  PRAGMA_END_PACKED


在以下snippet中使用它:

lba_t
cdio_msf_to_lba (const msf_t *msf)
{
  uint32_t lba = 0;

  cdio_assert (msf != 0);

  lba = cdio_from_bcd8 (msf->m);
  lba *= CDIO_CD_SECS_PER_MIN;

  lba += cdio_from_bcd8 (msf->s);
  lba *= CDIO_CD_FRAMES_PER_SEC;

  lba += cdio_from_bcd8 (msf->f);

  return lba;
}


基本上,我需要在C#中复制相同的行为。

题:

cdio_assert是否对msf_s的每个字段求和并断言它们不等于零?

最佳答案

如果您仔细查看链接的代码,请执行以下操作:

void
cdio_lsn_to_msf (lsn_t lsn, msf_t *msf) // <===== here
{
  int m, s, f;

  cdio_assert (msf != 0);

  // ...


您会看到变量msf是指向msf_t类型的变量的指针。虽然将结构设为0毫无意义,但指针可以很好地称为0,也称为NULL。该行只是在使用msf之前确保它是有效的。大多数情况下,这是通过if完成的,但是此函数显然希望该值有效。

C#中的等效项是声明msf != null

08-26 00:09