Re: why do we use while (0)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Yes I get an error in this code -
---------------------------------
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;
}

--------------------------

 

Got the reason why while (0) is there.
Thanks man!
- Arvind


 
On 12/26/07, sahlot arvind <asahlot@xxxxxxxxx> wrote:
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 <lizf@xxxxxxxxxxxxxx > 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
       ...;



[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux