I tried this -
---------------------------------
struct list_head {
    struct list_head *next, *prev;
};

#define INIT_LIST_HEAD(ptr)    {(ptr)->next = (ptr); (ptr)->prev = (ptr);}

int main ()
{
    int i;
    struct list_head mylist;
    struct list_head *ptr = &mylist;
    printf ("hi\n");
    if (i)
    {
        INIT_LIST_HEAD(ptr);
    }
    else
    {
        printf ("jkldkas\n");
    }
    return 0;
}
--------------------------

And there is no compilation error.



On 12/26/07, Li Zefan <[EMAIL PROTECTED]> wrote:
>
> sahlot arvind wrote:
> > Recently I started looking into linux kernel and trying to understand
> the
> > code.
> > I am working with linux-2.6.9.
> > in file include/llinux/list.h - I found something like this.
> >
> > #define INIT_LIST_HEAD(ptr) do { \
> >         (ptr)->next = (ptr); (ptr)->prev = (ptr); \
> > } while (0)
> >
> >
> > My question is why do we use a loop when we actually know that it is not
> > going to execute more than once? Cannot we simply do -
> >
> > #define INIT_LIST_HEAD(ptr)    {(ptr)->next = (ptr); (ptr)->prev =
> (ptr)}
> >
> > Do we get some kind of optimization by using while (0)?
> >
>
> with #define INIT_LIST_HEAD(ptr)    {(ptr)->next = (ptr); (ptr)->prev =
> (ptr);}
>
> try this:
>
> if (...)
>        INIT_LIST_HEAD(ptr);
> else
>        ...;
>
> you will get compilation error:
>
> error: expected expression before 'else'
>
> see why? expand the macro:
>
> if (...)
> {
>        (ptr)->next = (ptr);
>        (ptr)->prev = (ptr);
> };   <---here
> else
>        ...;
>

Reply via email to