C 如何断言此结构不等于零?

How does C assert that this struct is not equal to zero?

我试图了解(以我的 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.

...为了详细说明 Marco 的观点,代码(恕我直言) 应该使用 NULL,而不是零。

如果您看到 "zero,",您会自动假设 "the variable being tested is a number." 如果您看到 NULL,您会自动知道它是一个指针。尽管这两种说法可能是等价的,并且都可能有效,但可以通过编写 清晰的源代码来避免导致提出这个问题的混淆。

当我们阅读其他人的源代码时,我们在很大程度上受这些指导"implications."出于这个原因,有可能直接查看错误而没有看到它。