我试图(以我的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
。