LINUX.ORG.RU

sizeof(winsize) или sizeof(struct winsize)

 , ,


0

2

myfile.c:

#include <asm/termios.h>
#include <stdio.h>

int main(int argc, char**argv) {
  printf(" :size %i)", sizeof(struct winsize));
}
Какая галочка в компиляторе может повлиять на на то, что без слова struct файл не компилируется gcc со словами error: ‘winsize’ undeclared (first use in this function)?

Код без слова struct сгенерировал мне cffi-grovel. Думаю, он что-то при этом имел в виду :)

★★★★★

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

Думаю, он что-то при этом имел в виду :)

Это он пошутил.

Или надеется, что кто-то за него typedef сделает.

Pythagoras ★★
()
Ответ на: комментарий от i-rinat

C которым потом сам же не сможет работать :)

staseg ★★★★★
()

Ты уже две звезды наскреб, а так тегом [code] пользоваться и не научился?

И вашпе, сфига ли должен gcc понимать это, если ты typedef не делал?

Eddy_Em ☆☆☆☆☆
()

Сам сравни и подумай:

struct winsize ws;
printf("%zu\n", sizeof(ws));
vs.
printf("%zu\n", sizeof(struct winsize));
PS: и да, осиль уже тег [code]

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 1)
Ответ на: комментарий от beastie

den73 с другого компьютера

Рад делегировать радость думания тебе! Ты хочешь сказать, структура не определена у меня? Но она вроде в указанном заголовочнике есть.

anonymous
()
Ответ на: den73 с другого компьютера от anonymous

там написано:

struct winsize {
         unsigned short ws_row;
         unsigned short ws_col;
         unsigned short ws_xpixel;
         unsigned short ws_ypixel;
  };
anonymous
()
Ответ на: комментарий от true_admin

Потому, что фактический размер переменной может быть больше, т.е. выравнен на 4/8/etc. байт - для упрощения последовательного доступа к элементам массива либо последующим данным, например. Поэтому всегда лучше делать

memset( x, 0, sizeof( *x ) );
чем
memset( x, 0, sizeof( typeof x ) );

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

Потому, что фактический размер переменной может быть больше, т.е. выравнен на 4/8/etc. байт - для упрощения последовательного доступа к элементам массива либо последующим данным, например.

А как же «When applied to an operand that has structure or union type, the result is the total number of bytes in such an object, including internal and trailing padding»?

i-rinat ★★★★★
()
Ответ на: комментарий от true_admin

это не декларация указателя а разыменование

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

Это не так. sizeof() возвращает число, которое включает в себя размер структуры + выравнивание.

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

Не получилось воспроизвести. pack(push,1) у меня в GCC на типы действует, а на переменные — нет.

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

den73 с другого компьютера

Т.е. я правильно понял, что действительно должно быть слово struct?

Скармливаю я cffi-grovel-у cstruct, вот как:

https://bitbucket.org/budden/oduvanchik/src/99750e86ca140818b5c54655e0eaa1753...

Пакет определён вот тут: https://bitbucket.org/budden/oduvanchik/src/99750e86ca140818b5c54655e0eaa1753...

anonymous
()
Ответ на: den73 с другого компьютера от anonymous

Похоже, я неправильно применил cffi-grovel. Канонический пример использования cffi-grovel - это библиотека iolib. Там в описании С-типа структуры добавлено слово struct. Т.е., мне надо декларировать структуру так:

(cg::cstruct winsize "struct winsize"
             (ws_row "ws_row" :type :unsigned-short)
             (ws_col "ws_col" :type :unsigned-short)
             )
а не так:
(cg::cstruct winsize "winsize" ...)

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