LINUX.ORG.RU

История изменений

Исправление kirk_johnson, (текущая версия) :

Можно пример ?

Код:

#include <stdlib.h>
#include <sys/queue.h>

struct foo {
	int a;
	TAILQ_ENTRY(foo) entry;
};
TAILQ_HEAD(foo_queue, foo);

struct bar {
	void *ptr;
	TAILQ_ENTRY(bar) entry;
};
TAILQ_HEAD(bar_queue, bar);

int main(void)
{
	struct bar       b;
	struct foo_queue fq;

	TAILQ_INIT(&fq);
	TAILQ_INSERT_TAIL(&fq, &b, entry);
	exit(EXIT_SUCCESS);
}

Вывод:

$ clang -Wall test.c   
test.c:23:2: warning: incompatible pointer types assigning to 'struct bar **' from 'struct foo **' [-Wincompatible-pointer-types]
        TAILQ_INSERT_TAIL(&fq, &b, entry);
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/sys/queue.h:404:24: note: expanded from macro 'TAILQ_INSERT_TAIL'
        (elm)->field.tqe_prev = (head)->tqh_last;                       \
                              ^ ~~~~~~~~~~~~~~~~
test.c:23:2: warning: incompatible pointer types assigning to 'struct foo *' from 'struct bar *' [-Wincompatible-pointer-types]
        TAILQ_INSERT_TAIL(&fq, &b, entry);
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/sys/queue.h:405:20: note: expanded from macro 'TAILQ_INSERT_TAIL'
        *(head)->tqh_last = (elm);                                      \
                          ^ ~~~~~
test.c:23:2: warning: incompatible pointer types assigning to 'struct foo **' from 'struct bar **' [-Wincompatible-pointer-types]
        TAILQ_INSERT_TAIL(&fq, &b, entry);
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/sys/queue.h:406:19: note: expanded from macro 'TAILQ_INSERT_TAIL'
        (head)->tqh_last = &(elm)->field.tqe_next; 

Отчего же ? Что мне мешает использовать оригинальный BSD вариант ?

Ничего. А вот внутренности gcc не являются публичным API. И завтра его оттуда могут выкинуть.

P.S. Лулз в том, что у gcc < 5.x похоже просто забивает на несовпадение типов.

Исправление kirk_johnson, :

Можно пример ?

Код:

#include <stdlib.h>
#include <sys/queue.h>

struct foo {
	int a;
	TAILQ_ENTRY(foo) entry;
};
TAILQ_HEAD(foo_queue, foo);

struct bar {
	void *ptr;
	TAILQ_ENTRY(bar) entry;
};
TAILQ_HEAD(bar_queue, bar);

int main(void)
{
	struct bar       b;
	struct foo_queue fq;

	TAILQ_INIT(&fq);

	TAILQ_INSERT_TAIL(&fq, &b, entry);

	exit(EXIT_SUCCESS);
}

Вывод:

$ clang -Wall test.c   
test.c:23:2: warning: incompatible pointer types assigning to 'struct bar **' from 'struct foo **' [-Wincompatible-pointer-types]
        TAILQ_INSERT_TAIL(&fq, &b, entry);
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/sys/queue.h:404:24: note: expanded from macro 'TAILQ_INSERT_TAIL'
        (elm)->field.tqe_prev = (head)->tqh_last;                       \
                              ^ ~~~~~~~~~~~~~~~~
test.c:23:2: warning: incompatible pointer types assigning to 'struct foo *' from 'struct bar *' [-Wincompatible-pointer-types]
        TAILQ_INSERT_TAIL(&fq, &b, entry);
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/sys/queue.h:405:20: note: expanded from macro 'TAILQ_INSERT_TAIL'
        *(head)->tqh_last = (elm);                                      \
                          ^ ~~~~~
test.c:23:2: warning: incompatible pointer types assigning to 'struct foo **' from 'struct bar **' [-Wincompatible-pointer-types]
        TAILQ_INSERT_TAIL(&fq, &b, entry);
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/sys/queue.h:406:19: note: expanded from macro 'TAILQ_INSERT_TAIL'
        (head)->tqh_last = &(elm)->field.tqe_next; 

Отчего же ? Что мне мешает использовать оригинальный BSD вариант ?

Ничего. А вот внутренности gcc не являются публичным API. И завтра его оттуда могут выкинуть.

P.S. Лулз в том, что у gcc < 5.x похоже просто забивает на несовпадение типов.

Исходная версия kirk_johnson, :

Можно пример ?

Код:

#include <stdlib.h>
#include <sys/queue.h>

struct foo {
	int a;
	TAILQ_ENTRY(foo) entry;
};
TAILQ_HEAD(foo_queue, foo);

struct bar {
	void *ptr;
	TAILQ_ENTRY(bar) entry;
};
TAILQ_HEAD(bar_queue, bar);

int main(void)
{
	struct bar       b;
	struct foo_queue fq;

	TAILQ_INIT(&fq);

	TAILQ_INSERT_TAIL(&fq, &b, entry);

	exit(EXIT_SUCCESS);
}

Вывод:

$ clang -Wall test.c   
test.c:23:2: warning: incompatible pointer types assigning to 'struct bar **' from 'struct foo **' [-Wincompatible-pointer-types]
        TAILQ_INSERT_TAIL(&fq, &b, entry);
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/sys/queue.h:404:24: note: expanded from macro 'TAILQ_INSERT_TAIL'
        (elm)->field.tqe_prev = (head)->tqh_last;                       \
                              ^ ~~~~~~~~~~~~~~~~
test.c:23:2: warning: incompatible pointer types assigning to 'struct foo *' from 'struct bar *' [-Wincompatible-pointer-types]
        TAILQ_INSERT_TAIL(&fq, &b, entry);
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/sys/queue.h:405:20: note: expanded from macro 'TAILQ_INSERT_TAIL'
        *(head)->tqh_last = (elm);                                      \
                          ^ ~~~~~
test.c:23:2: warning: incompatible pointer types assigning to 'struct foo **' from 'struct bar **' [-Wincompatible-pointer-types]
        TAILQ_INSERT_TAIL(&fq, &b, entry);
        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/sys/queue.h:406:19: note: expanded from macro 'TAILQ_INSERT_TAIL'
        (head)->tqh_last = &(elm)->field.tqe_next; 

Отчего же ? Что мне мешает использовать оригинальный BSD вариант ?

Ничего. А вот внутренности gcc не являются публичным API. И завтра его оттуда могут выкинуть.