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."出于这个原因,有可能直接查看错误而没有看到它。
我试图了解(以我的 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."出于这个原因,有可能直接查看错误而没有看到它。