Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет kouzdra ([info]kouzdra)
@ 2010-08-03 10:48:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
К недавнему посту:
Я радовался фрагменту кода из GTK+:

int width = 
    ((union { char *string; unsigned int word; })
           nl_langinfo(_NL_PAPER_WIDTH)).word


На самом деле это обернуто в макру (файл gtk/gtkpapersize.c, если кому-то это интересно):

#define NL_PAPER_GET(x)         \
  ((union { char *string; unsigned int word; })nl_langinfo(x)).word


но, imho, это ничего не меняет: imho это полный эквивалент

#define NL_PAPER_GET(x) ((unsigned)nl_langinfo(x))


Вопрос - на фига было использовать компиляторно-зависимую конструкцию в контексте, где она
1) имеет точный аналог в рамках стандарта
2) этот аналог еще и короче и понятнее

Или я все-таки чего-то не понимаю и есть какая-то тонкая разница?


(Добавить комментарий)


[info]gogabr
2010-08-03 11:50 (ссылка)
Выравнивание?

Так, как оно написано, слово должно попасть на границу по размеру указателя (допустим, например, что указатель имеет размер 8, а целое -- 4).

Зачем это нужно и почему, уж если нужно и если нельзя это выразить менее коряво, они не написали отдельный откомментированный макрос align_by_pointer_size -- это другой вопрос.

(Ответить) (Ветвь дискуссии)


[info]gogabr
2010-08-03 12:06 (ссылка)
Посмотрел, что такое nl_langinfo.
Представил себе следующий уебищный сценарий:
Имеем 8-байтовый указатель, 4-байтовое целое и big-endian архитектуру.
Тогда (unsigned)nl_langinfo(x) выдаст младшие 4 байта вернутого значения, а приведенная конструкция -- старшие.
Но для того, чтобы именно приведенная конструкция работала как надо, а простое преобразование -- нет, реализация nl_langinfo должна быть устроена аналогично вывернутым образом.

(Ответить) (Уровень выше)


[info]ketmar
2010-08-04 16:43 (ссылка)
есть. чтобы вражеский компилятор подавился.

(Ответить)


[info]helvegr
2010-08-04 22:09 (ссылка)
Strict aliasing?

An object shall have its stored value accessed only by an lvalue expression that has one of
the following types:

— a type compatible with the effective type of the object,
— a qualified version of a type compatible with the effective type of the object,
— a type that is the signed or unsigned type corresponding to the effective type of the
object,
— a type that is the signed or unsigned type corresponding to a qualified version of the
effective type of the object,
— an aggregate or union type that includes one of the aforementioned types among its
members (including, recursively, a member of a subaggregate or contained union), or
— a character type.

(Ответить)