- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
void rtm_guard(void) {
/*
Don't even try to MS VC that stuff, zerobuffy 4eyes.
*/
unsigned char buf0[0];
unsigned a = 0xF001BA11;
unsigned b = 0xF001BA11;
unsigned c = 0x55550000;
unsigned d = 0xF001BA11;
unsigned e = 0xF001BA11;
unsigned char buf1[0];
ptrdiff_t diff = buf0 - buf1;
const char* prnt;
switch (diff) {
case sizeof rtm_guard:
prnt = "dear Nizhny Novgorod '-O1' lover";
break;
case sizeof (int):
prnt = "'gcc -O0' bastard";
break;
default:
prnt = "\b";
};
(diff == sizeof (int) || diff == sizeof rtm_guard) ?
fprintf(stderr, "%s%s%s",
"Hey you, ", prnt, ", what the hell are you trying to bang here w/o mandatory flags? Forgot something? \n"), abort() :
0;
}
Сodebomb в рантайме наложил. Но нафига? Присосаться хуком и послать курить джуника с лидом как рукопожато билдить?
https://ideone.com/rnXBXJ
Минус, потому что gcc не пушит локалки по одной, а сразу выделяет под них память.
В Шланге ноль почему-то:
https://ideone.com/mw2w3V
И нужно предусмотреть разные варианты выравнивания.
«Watcom, Digital Mars, LCC кладут локалки по возрастанию, как и глобалки.
gcc, шланг, MSVC, Борланд, Pelles C кладут локалки по убыванию адресов.
Ещё выравнивания локалок у разных компиляторов разные. MSVC и LCC любят выравнивать на 8 байт.»
1. Имя типа, например, sizeof(int). Здесь скобки обязательны.
2. Выражение, которое не вычисляется, а только выводитмя его тип. В примере sizeof rtm_guard выводится тип, возвращаемый rtm_guard, в данном случае void, т. е. это эквивалентно sizeof(void).
Заметь, что во втором варианте sizeof скобки можно опускать. Вот такая неочевидная фигня.
А был бы указатель, было бы sizeof &rtm_guard
Тогда вообще непонятное выражение.
Я понимаю, если сделали бы как sizeof(&fun), это хотя бы логично...