почему не работает этот код, когда как у другого разработчика этот код работает?
изучаю программу unrealircd. там есть такой код.
list_for_each_entry(client, &lclient_list, lclient_node)
(void) send_queued(client);
я посмотрел где опеределен этот дефайн.
#define list_for_each_entry(pos, head, member) \
for (pos = list_entry((head)->next, typeof(*pos), member); \
&pos->member != (head); \
pos = list_entry(pos->member.next, typeof(*pos), member))
и я так понимаю что этот код рабочий. а у меня пишет ошибку. вот что я написал для теста.
#include <stdio.h>
#include <stdlib.h>
struct p {
int a;
struct p *next;
};
#define list_for_each_entry ( p, head ) \
for ( p = head; p != NULL; p = p->next )
int main ( ) {
struct p *head, *p;
head = calloc ( 1, sizeof ( struct p ) );
p = head;
int i = 0;
for ( p = head; i < 3; i++, p = p->next ) {
p->a = i;
p->next = calloc ( 1, sizeof ( struct p ) );
}
p->next = NULL;
p = NULL;
list_for_each_entry ( p, head )
printf ( "pos %d\n", p->a );
}
пишет ошибку.
gcc main.c -o test
main.c: In function ‘main’:
main.c:10:2: error: expected ‘;’ before ‘for’
for ( p = head; p != NULL; p = p->next )
^
main.c:26:2: note: in expansion of macro ‘list_for_each_entry’
list_for_each_entry ( p, head )
^~~~~~~~~~~~~~~~~~~
makefile:2: recipe for target 'all' failed
make: *** [all] Error 1
Ответы (1 шт):
Автор решения: eanmos
→ Ссылка
Уберите пробел после имени макроса:
#define list_for_each_entry( p, head ) \
for ( p = head; p != NULL; p = p->next )
Препроцессор считает, что ( p, head ) — это не аргументы макроса, а текст подстановки, поэтому после подстановки макрос разворачивается в
( p, head )
for ( p = head; p != NULL; p = p->next)
После выражения ( p, head ) нет точки запятой, т. е. не образуется отдельный statement, поэтому компилятор диагностирует синтаксическую ошибку.