Size: a a a

2021 February 14

FO

FORTRAN ONE LOVE in codingteam
ttldtor
мне не нравится sphinx
тогда точно твоих =)
источник

t

ttldtor in codingteam
я за doxygen и ddoc
источник

t

ttldtor in codingteam
codingteam@cjr
sergevp
@ttldtor, Ведь С не требует описания структуры, чтобы указать её в параметрах: https://gcc.godbolt.org/z/4hWWME
а это в стандарте прям описано, да?
источник

t

ttldtor in codingteam
тогда я не понимаю, зачем писали везде void*
источник

t

ttldtor in codingteam
или это синоним получается?
источник

c

codingteam@cjr in codingteam
sergevp
Ну, готовой ссылки на стандарт у меня под рукой нет, но да, для си это просто указатель, и ему не важно, на что. Насколько я помню, для указателей на структуру не нужно описание самой структуры. Даже forward declaration не обязателен.
источник

t

ttldtor in codingteam
тут немного устаревший, патюсь найти http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf
источник

t

ttldtor in codingteam
пишут, что вот это UB:
When  the  complete  type  is  needed,  an  incomplete  structure  or  union  type  is  notcompleted in the same scope by another declaration of the tag that defines the content
источник

c

codingteam@cjr in codingteam
sergevp
А needed ли тут complete type?
источник

t

ttldtor in codingteam
ну, в принципе, компилятор может "увидеть" непонятное имя и указатель, решить "а, пофиг, линковщик разберётся"

только вот это я не могу найти, для меня это выглядит как unspecified behavior
источник

c

codingteam@cjr in codingteam
sergevp
Не, там что-то более сложное. В https://cigix.me/c17#6.7.2.3.p8 написано, что если где-то встречается:
 struct XXX <что-то>
и при этом `struct XXX` раньше не объявялось, то эта строка считается его объявлением.
источник

c

codingteam@cjr in codingteam
sergevp
Но вот тут https://stackoverflow.com/a/2895369 кто-то отметил, что у объявления есть область видимости. И (если `struct XXX` ещё не объявлялось) строки вида:
 void foo(struct XXX *p);
 void bar(struct XXX *p);
 void baz(struct XXX *p);
объявляют три РАЗНЫЕ структуры, у каждой функции свою.
источник

c

codingteam@cjr in codingteam
sergevp
Но если объявление было, пусть даже неполное:
 struct X;
 void foo(struct X *p);
 void bar(struct X *p);
 void baz(struct X *p);
то тогда структуры будут уже одинаковыми.
источник

t

ttldtor in codingteam
codingteam@cjr
sergevp
Но вот тут https://stackoverflow.com/a/2895369 кто-то отметил, что у объявления есть область видимости. И (если `struct XXX` ещё не объявлялось) строки вида:
 void foo(struct XXX *p);
 void bar(struct XXX *p);
 void baz(struct XXX *p);
объявляют три РАЗНЫЕ структуры, у каждой функции свою.
без ссылки на стандарт такие вещи не принимаются же как ответы)
источник

c

codingteam@cjr in codingteam
sergevp
Ну, да, я только имею ввиду, что это не просто unspecified behavior... Он явно где-то specified...
источник

c

codingteam@cjr in codingteam
sergevp
А! Кажется, разобрался. В общем, в С есть такая категория типов "incomplete type" — это тип, у которого не известен размер объекта ( https://cigix.me/c17#6.2.5.p1 ). В частности "void" — это "incomplete type" ( https://cigix.me/c17#6.2.5.p19 ). Структура или union с неизвестным содержимым — это тоже "incomplete type" ( https://cigix.me/c17#6.2.5.p22 ). И forward declaration структуры тоже объявляет её как incomplete type ( https://cigix.me/c17#6.7.2.3.p4 ).
источник

c

codingteam@cjr in codingteam
sergevp
Так вот.
источник

c

codingteam@cjr in codingteam
sergevp
https://cigix.me/c17#footnote131 : An incomplete type may only by used when the size of an object of that type is not needed. [...] for example when a pointer to or a function returning a structure or union is being declared.
источник

c

codingteam@cjr in codingteam
sergevp
@ttldtor> тут немного устаревший, патюсь найти http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf

В этой ссылке это сноска 111 пункта 6.7.2.3p4
источник

c

codingteam@cjr in codingteam
Minoru
утро!
источник