LINUX.ORG.RU

Зависимые друг от друга типы

 


0

1

Вот такая ситуация:

#include <stdlib.h>

#define HANDLER_N 8

typedef void (*handler_t)(object_t *object);

typedef struct
{
	int x, y;

	size_t handler_i;
	handler_t handler[HANDLER_N];
} object_t;

int main()
{
	return EXIT_SUCCESS;
}
$ make main
cc     main.c   -o main
main.c:5: error: expected ‘)’ before ‘*’ token
main.c:12: error: expected specifier-qualifier-list before ‘handler_t’
make: *** [main] Error 1
$
Я вижу только такое решение: объявление типа handler_t убрать,
а в структуре вместо него использовать void *.

Есть ли более правильное решение?

★★★

Последнее исправление: LinuxUser (всего исправлений: 1)

Есть ли более правильное решение?

Да, целых четыре: 1) учить Си; 2) учиться задавать вопросы; 3) сделать forward declaration типа аргумента; 4) использовать void * в роли object_t.

Я склоняюсь к тому, что правильным является комбинация 1 и 2.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)

struct _object_t; typedef void (*handler_t)(struct _object_t object);

typedef struct _object_t { int x, y;

size_t handler_i; handler_t handler[HANDLER_N]; } object_t;

anonymous
()
#include <stdlib.h>

#define HANDLER_N 8

typedef struct object
{
        int x, y;

            size_t handler_i;
            void (*handler[HANDLER_N])(struct object object);
} object_t;

typedef void (*handler_t)(object_t object);

int main()
{
        return EXIT_SUCCESS;
}

Но зачем так жить? Легче передать структуру по указателю.

AptGet ★★★
()

ТС, ты тупой.

#include <stdlib.h>

#define HANDLER_N 8

struct object;

typedef void (*handler_t)(struct object*);

typedef struct object
{
    int x, y;

    size_t handler_i;
    handler_t handler[HANDLER_N];
} object_t;

int main()
{
            return EXIT_SUCCESS;
}
anonymous
()
Ответ на: комментарий от anonymous

ежели она меньше 8 байт, то вполне оправдано.

Оправданность определяется семантикой, а не размером. И да, в приведенном коде размер значительно больше 8 байт.

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

а можно мне рецензию выдать?

#define HANDLER_N 8

typedef struct object object_t;
typedef void (*handler_t)(object_t*);
struct object
{
    int x, y;

    size_t handler_i;
    handler_t handler[HANDLER_N];
};

anonymous
()
Ответ на: комментарий от LinuxUser

это хорошо что ты эту фразу написал, а то раз 10 перечитывал ответы.

anonymous
()
Ответ на: комментарий от anonymous

Точно. Вот я тупой. Надо срочно умнеть.

LinuxUser ★★★
() автор топика
Ответ на: комментарий от anonymous

Правильный ответ не попал в первую десятку. И эти люди пытаются запретить анонимуса в development?

anonymous
()
#include <stdlib.h>

#define HANDLER_N 8

struct object_t
{
	int x, y;

	size_t handler_i;
	void (*handler[HANDLER_N])(struct object_t *);
};

int main()
{
	return 0;
}

#include <stdlib.h>

#define HANDLER_N 8

struct object_t;
typedef (*handler_t)(struct object_t *);

struct object_t
{
	int x, y;

	size_t handler_i;
	handler_t handler[HANDLER_N];
};

int main()
{
	return 0;
}
nanoolinux ★★★★
()
Ответ на: комментарий от anonymous

ещё бы. Стыдятся собственной некомпетентности в сравнении с ним.

anonymous
()

Надеялся увидеть вопрос о type families в говняшной, но все оказалось более прозаично.

anonymous
()
Ответ на: комментарий от LinuxUser

То, что «зависимые типы» уже достаточно устоявшийся и известный термин.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.