I tried this -
---------------------------------
struct list_head {
struct list_head *next, *prev;
};
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
...;