LINUX.ORG.RU

[C][структура][gcc]ошибка


0

1

Собственно, структура:

typedef struct
{
	GtkTreeStore* left_tree_store;
	GtkTreeStore* right_tree_store;
} data;

При компиляции выдает:
In file included from /home/netcat/HardInform/src/main.c:6:
/home/netcat/HardInform/src/general.h:9: error: conflicting types for ‘data’
/home/netcat/HardInform/src/general.h:9: note: previous declaration of ‘data’ was here
/home/netcat/HardInform/src/main.c: In function ‘main’:
/home/netcat/HardInform/src/main.c:20: warning: comparison between pointer and integer
make[2]: *** [CMakeFiles/HardInform.dir/src/main.c.o] Ошибка 1
make[1]: *** [CMakeFiles/HardInform.dir/all] Ошибка 2
make: *** [all] Ошибка 2

★★

А что будет, если этот тип назвать НЕ data?

ttnl ★★★★★ ()

Очень похоже на двойное включение include.
#ifndef в начале инклуда стоит?

trex6 ★★★★★ ()

а что там в general.h? там нечно с именем data не определено случайно?

да, и это, из своего опыта советую тебе дописать _t к твоей data, что-бы было так:

typedef struct {
tralala
} data_t;
mi_estas ()
Ответ на: комментарий от mi_estas

да, и это, из своего опыта советую тебе дописать _t к твоей data,

Афигенный опыт, имена заканчивающие на _t зарезервированы, info libc.

Begemoth ★★★★★ ()

прятать структуры за typedef - весьма отстойная идея.

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

> да, и это, из своего опыта советую тебе дописать _t к твоей data, что-бы было так:

Пестец. У вас плохой опыт.

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

имена заканчивающие на _t зарезервированы, info libc.

Там я не нашел такого. Где об этом сказано?

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

Где об этом сказано?

Раздел 1.3.3. Introduction/Using the Library/Reserved Names.

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

Вот бля, я сейчас на маке - там info libc переходит на info libconfig.

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

А обоснование будет?

Или хотя бы ссылка на обоснование?

Хотелось бы почитать.

PS: Это не ёрничанье, просто на личном опыте так и не удалось понять: определять структуры, как типы с помощью typedef - это хорошо или плохо.

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

Определять структуры с typedef удобно, ведь потом при обьявлении можно будет писать не struct data blablabla, a data blablabla.

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

Да нет - это-то я понимаю - сам так делал многократно.

В небольших и средних проектах, где десяток таких typedef'ов можно собрать в одном месте (h-файле), это удобно, без сомнения.

Анонимус говорит, что «прятать структуры за typedef - весьма отстойная идея.»

Иногда посещала эта же мысль - в огромных проектах, где таких typedef'ов сотни, и все разбросаны, где попало. И вправду «отстой» получался...

Вот я и хочу что-либо внятное прочесть или услышать по поводу определения типов данных, как typedef <структура>. Пока - тишина.

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

А что, если обьявлять структуры без typedef, а потом создать отдельный .h файл с записями, типа: typedef struct blabla bububu?

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

Так вот в том и вся фигня, что когда в очень большом проекте начинаешь искать именно определение структуры, и это приходится делать по цепочке h-файлов, то это начинает ...эммм... раздражать. Особенно, когда надо быстро посмотреть, что же там внутри у этой blabla.

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

Вдогонку - пример «из жизни»:

В одном немаленьком проекте с многими участниками мне даже пришлось собирать файлик-справочничек с этими typedef-структурами, которые клепали все, кому не лень. Так вот: таких структур там точно было больше полусотни. Да ещё и взаимозависимые попадались. Искать их «внутренности» по всей базе кода было «сплошное удовольствие».

Вот я и хочу узнать: правильна ли и допустима ли такая организация, есть ли альтернативы, в общем, все pro и contra.

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

правильна ли и допустима ли такая организация, есть ли альтернативы, в общем, все pro и contra.

Традиционно есть два способа записи структур с тайпдефами:

typedef struct data
{
   GtkTreeStore* left_tree_store;
   GtkTreeStore* right_tree_store;
} data;
typedef struct data data;
struct data
{
   GtkTreeStore* left_tree_store;
   GtkTreeStore* right_tree_store;
};

Если не городить после этого чего-нибудь типа:

typedef data another_data;
проблем быть не должно.

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