LINUX.ORG.RU

Нубский вопрос по Си.


0

0

Есть некая структура с полями указателями на виртуальные методы. Хочется сделать типы этих полей читаемыми, то есть что-то вроде:

#ifndef AGENT_H
#define AGENT_H
#include "genome.h"
#include "world.h"
#include "neuro.h"

typedef void action_context_t;

typedef action_t* (*action_func_t)(action_context_t* context, sensor_t* sensor);
typedef agent_t* (*agent_born_func_t)(agent_t* agent);

typedef enum {TOP, BOTTOM, LEFT, RIGHT} direction_t;

typedef struct {
	neuro_t* neuro;
	energy_t energy;
	genome_t* genome;
	cell_t* cell;
	direction_t direction;
	energy_t energy_max;
	int infected;
	action_func_t action;
	action_context_t* action_context;
	agent_born_func_t new_agent;
} agent_t;

void agent_action(agent_t* agent);
void agent_work(agent_t* agent);
void agent_unref(agent_t* dead);

#endif

Но тут, понятное дело, ошибка - agent_t undeclared. Как это сделать читаемо (то есть без void*), чтобы agent_t сохранить?

★★

в самом начале:

typedef struct __agent_t agent_t;

потом описание интерфейсов функций с agent_t*.

и в самом конце:

struct __agent_t {
    …
};

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

>И что я там интересное найду?

Скорее всего: Chapter 5: Typedefs.

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

>> Если ты нуб, почитай CodingStyle ядра.

> И что я там интересное найду?

Ты, нуб, даже о forward declarations не знающий, не найдешь там ничего интересного? Ахренеть.

P.S. сколько раз повторять, typedef-имена, заканчивающиеся на _t, зарезервированы.

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

> P.S. сколько раз повторять, typedef-имена, заканчивающиеся на _t, зарезервированы.

ссылку на стандарт

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

>Ты, нуб, даже о forward declarations не знающий, не найдешь там ничего интересного?

Хм, где я это говорил?

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

> P.S. сколько раз повторять, typedef-имена, заканчивающиеся на _t, зарезервированы.

сколько раз тебя спрашивали, "где это написано в стандарте, сцуко?", а ты как партизан, молчишь.

CL-USER
()
Ответ на: комментарий от CL-USER

>> P.S. сколько раз повторять, typedef-имена, заканчивающиеся на _t, зарезервированы.

> сколько раз тебя спрашивали, "где это написано в стандарте, сцуко?", а ты как партизан, молчишь.

Они зарезервированы tailgunner'ом, а ссылаться на себя необязательно :)

Насколько я (не) помню, в кодингстайле сказано, что тайпдефить указатель на структуру имеет смысл только в том случае, когда структура не определяется в хедере и, следовательно, пользовательский код не ковыряется в структуре, а только перекладывает указатели на неё.

const86 ★★★★★
()
Ответ на: комментарий от CL-USER

> сколько раз тебя спрашивали, "где это написано в стандарте, сцуко?", а ты как партизан, молчишь.

есть такое. идентификаторы вида *_t зарезервированы под тайпдефы позикс-либ. но т.к. nobody cares, это скорее рекомендация. хотя для софта, претендующего на сертификацию это закон.

arsi ★★★★★
()
Ответ на: комментарий от CL-USER

>> P.S. сколько раз повторять, typedef-имена, заканчивающиеся на _t, зарезервированы.

> сколько раз тебя спрашивали, "где это написано в стандарте, сцуко?", а ты как партизан, молчишь.

Я давал ссылку на стандарт пару раз, потом надоело.

>+ Apache Portable Runtime

>+ Apache webserver

Они хотя бы префиксы используют.

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

Вообще много кто использует _t. Видимо всем покласть на рекомендации из posix. Ну и действительно, удобно же, сразу ясно, что это тип.

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