- 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;
}
Экое извращение
guest8 28.08.2019 03:23 # −999
nemyx 28.08.2019 15:22 # +2
Rooster 28.08.2019 16:29 # 0
guest8 15.09.2019 18:16 # −999
guest8 15.09.2019 18:17 # −999
ropuJIJIa 15.09.2019 18:21 # 0
guest8 15.09.2019 18:22 # −999
guest8 15.09.2019 18:21 # −999
ropuJIJIa 15.09.2019 18:22 # 0
adrnin 28.08.2019 03:30 # 0
http://govnokod.ru/user/25930/codes
guest8 28.08.2019 03:33 # −999
cmepmop 28.08.2019 11:29 # 0
guest8 28.08.2019 16:34 # −999
Rooster 28.08.2019 16:50 # 0
Именно поэтому я за "Си".
guest8 28.08.2019 16:55 # −999
nemyx 28.08.2019 17:09 # +1
Именно поэтому я за «Си».
Кстати, именно поэтому на других процессорах можно обломаться, если выдвигать смелые предположения.
guest8 28.08.2019 17:11 # −999
adrnin 28.08.2019 21:01 # −1
А чот такое автоматическая переменная я не совсем понял, ты про сишный auto? Назуй он вообще нужен и как это отменяте существовование стека*+?
guest8 28.08.2019 21:07 # −999
adrnin 28.08.2019 21:17 # 0
> Это переменная, которая автоматически удаляется при выходе из блока.
Ок, как такое делать без стека?
Видосы и индусы не нужны.
guest8 28.08.2019 21:23 # −999
nemyx 28.08.2019 17:08 # 0
Сколько пушит сишка, зависит от коллконвеншона.
guest8 28.08.2019 17:10 # −999
nemyx 28.08.2019 17:13 # 0
Steve_Brown 28.08.2019 18:22 # +1
CO6AKA_CTPALLIHA9I 28.08.2019 19:03 # 0
Прочитал я про вариадические функции в сишке. Какое же говно...
В общем, если у функции в заголовке есть многоточие, то для всех неперечисленных аргументов вызывающий код производит повышение:
1. Все целые питухи, которые меньше инта, кастуются к инту.
2. Все плавающие питухи, которые меньше дабла (а их аж одна штука, а именно float), кастуются к даблу.
Т. е. при вызове макроса va_arg нельзя указывать типы char, short, float, int8_t и тому подобные. Можно указывать только типы, которые по размеру не меньше, чем int и double, а также указатели.
Какой размер имеет этот самый int, зависит от конкретного компилятора. Можно попасть в ситуацию, когда для какой-нибудь платформы есть несколько компиляторов и слинковать вместе сгенерированный ими код не получится.
guest8 28.08.2019 19:07 # −999
CO6AKA_CTPALLIHA9I 28.08.2019 19:22 # 0
Точно нельзя на x86 передавать структуру размером один байт, потому что вызывающий код запушит как минимум два байта, а тупой макрос va_arg прибавит к указателю единицу. Чтобы принять такую структуру, придётся дополнительно объявлять фиктивный тип размером в два байта.
Да вообще для всех структур нечётного размера придётся вводить фиктивный тип, округлённый до ближайшего чётного.
guest8 28.08.2019 21:07 # −999
CO6AKA_CTPALLIHA9I 28.08.2019 22:01 # 0
Если размер структуры нечётный, нужно явно объявить вспомогательный тип данных. Вручную мусорное поле можно и не добавлять, а прописать прагму для выравнивания (хотя нужно проверить).
CO6AKA_CTPALLIHA9I 28.08.2019 22:10 # 0
Для X86 он округлит sizeof до размера, кратного инту; для AMD64 он округлит до размера, кратного void*; на остальных платформах пошлёт напитон.
guest8 28.08.2019 22:21 # −999
cmepmop 28.08.2019 19:35 # 0
CO6AKA_CTPALLIHA9I 28.08.2019 20:12 # 0
guest8 28.08.2019 21:00 # −999
CO6AKA_CTPALLIHA9I 28.08.2019 20:08 # 0
В общем, gcc на x86-32 структуры хранит плотно, но когда пушит, дополняет случайным мусором до четырёх байтов.
guest8 15.09.2019 18:16 # −999
guest8 28.08.2019 22:01 # −999
guest8 28.08.2019 22:04 # −999
guest8 28.08.2019 22:06 # −999
guest8 28.08.2019 23:18 # −999
guest8 28.08.2019 23:23 # −999
CO6AKA_CTPALLIHA9I 29.08.2019 00:34 # 0