C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了这段代码意味着什么大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我找到了一个代码段.我不明白.似乎变量__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);
}

为什么这里没用无用的代码

解决方法

1.(void)(((typeof((n))*)0)==((uint64_t *)0));

请参阅Linux / include / asm-generic / div64.h:

例:

n必须是int,但它很短

void main()
{
    short n;
    (void)(((typeof((n)) *)0) == ((int *)0));
}

我们收到警告:
不同指针类型的比较缺乏强制转换

编译:gcc -o main main.c

编译器版本:gcc(GCC)4.9.2 20141101(Red Hat 4.9.2-1)

结论:

指针比较并非无用.如果传递给do_div()的变量的类型错误,它会生成警告.

2. __rem

大括号包围的代码是gcc语句表达式.
可以说,__rem是do_div()的返回值.

例:

#include <stdio.h>

#define do_div(n,basE)  ({ \
    int __rem = n % base;  \
    n /= base;             \
    __rem;                 \
})

int main()
{
    int a = 9;
    int b = 2;
    int c = 0;

    printf("%i / %i = ",a,b);
    c = do_div(a,b);
    printf("%i,reminder = %i\n",c);
    return 0;
}

输出:9/2 = 4,提醒= 1

在上面的例子中,c = do_div(a,b)等价于c =({int rem = a%b; a / = b; rem;}).

结论:

__rem并非无用,它是do_div()的“返回值”.

大佬总结

以上是大佬教程为你收集整理的这段代码意味着什么全部内容,希望文章能够帮你解决这段代码意味着什么所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。