我发现了一段代码。我不理解它。似乎变量__rem完全没有用处。下面的这行代码什么有用的工作也没做:
(void)(((typeof((n)) *)0) == ((uint64_t *)0)); \
整个代码段如下所示:
#define do_div(n,base) do{ \
uint32_t __base = (base); \
uint32_t __rem; \
(void)(((typeof((n)) *)0) == ((uint64_t *)0)); \
if (((n) >> 32) == 0) { \
__rem = (uint32_t)(n) % __base; \
(n) = (uint32_t)(n) / __base; \
} else \
__rem = __div64_32(&(n), __base); \
__rem; \
}while(0)
/* Wrapper for do_div(). Doesn't modify dividend and returns
* the result, not reminder.
*/
static inline uint64_t lldiv(uint64_t dividend, uint32_t divisor)
{
uint64_t __res = dividend;
do_div(__res, divisor);
return(__res);
}
这里为什么会有无用的代码?
__rem
是无用的,也许这段代码的作者从其他地方复制粘贴了它,并决定不去管它。一般来说,在执行此算法后,您可能想要知道rem
。猜测一下,也许这段代码曾经在 gcc 的 statement-expression 中,其中结尾处的__rem;
意味着__rem
的最终值是语句表达式的“返回值”。 - M.M_Bool
和_Alignas
可能暗示了第二个,但确实不清楚。幸运的是,从用户的角度来看,答案只是“不要”。 - Quentin