- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
#include <stdio.h>
#define my_type unsigned short
int main(void)
{
my_type a = 0;
printf("%d\n", a);
return 0;
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−6
#include <stdio.h>
#define my_type unsigned short
int main(void)
{
my_type a = 0;
printf("%d\n", a);
return 0;
}
Экое извращение
http://govnokod.ru/user/25930/codes
Именно поэтому я за "Си".
Именно поэтому я за «Си».
Кстати, именно поэтому на других процессорах можно обломаться, если выдвигать смелые предположения.
А чот такое автоматическая переменная я не совсем понял, ты про сишный auto? Назуй он вообще нужен и как это отменяте существовование стека*+?
> Это переменная, которая автоматически удаляется при выходе из блока.
Ок, как такое делать без стека?
Видосы и индусы не нужны.
Сколько пушит сишка, зависит от коллконвеншона.
Прочитал я про вариадические функции в сишке. Какое же говно...
В общем, если у функции в заголовке есть многоточие, то для всех неперечисленных аргументов вызывающий код производит повышение:
1. Все целые питухи, которые меньше инта, кастуются к инту.
2. Все плавающие питухи, которые меньше дабла (а их аж одна штука, а именно float), кастуются к даблу.
Т. е. при вызове макроса va_arg нельзя указывать типы char, short, float, int8_t и тому подобные. Можно указывать только типы, которые по размеру не меньше, чем int и double, а также указатели.
Какой размер имеет этот самый int, зависит от конкретного компилятора. Можно попасть в ситуацию, когда для какой-нибудь платформы есть несколько компиляторов и слинковать вместе сгенерированный ими код не получится.
Точно нельзя на x86 передавать структуру размером один байт, потому что вызывающий код запушит как минимум два байта, а тупой макрос va_arg прибавит к указателю единицу. Чтобы принять такую структуру, придётся дополнительно объявлять фиктивный тип размером в два байта.
Да вообще для всех структур нечётного размера придётся вводить фиктивный тип, округлённый до ближайшего чётного.
Если размер структуры нечётный, нужно явно объявить вспомогательный тип данных. Вручную мусорное поле можно и не добавлять, а прописать прагму для выравнивания (хотя нужно проверить).
Для X86 он округлит sizeof до размера, кратного инту; для AMD64 он округлит до размера, кратного void*; на остальных платформах пошлёт напитон.
В общем, gcc на x86-32 структуры хранит плотно, но когда пушит, дополняет случайным мусором до четырёх байтов.