- 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
 - 31
 - 32
 - 33
 - 34
 - 35
 - 36
 - 37
 - 38
 - 39
 - 40
 - 41
 - 42
 - 43
 - 44
 - 45
 - 46
 
                        HIMAGELIST ImageList_LoadImageV(PVOID ImageBase, PCWSTR a[], int level)
{
	PIMAGE_RESOURCE_DATA_ENTRY pirde;
	PBITMAPINFOHEADER pbih;
	DWORD cx, cy, cb, n, ofs;
	if (
		0 <= LdrFindResource_U(ImageBase, a, level, &pirde) && 
		0 <= LdrAccessResource(ImageBase, pirde, (void**)&pbih, &cb) &&
		cb > sizeof(BITMAPINFOHEADER) &&
		pbih->biSize >= sizeof(BITMAPINFOHEADER) &&
		(cx = pbih->biWidth) <= (cy = pbih->biHeight) &&
		!(cy % cx) &&
		pbih->biBitCount == 32 &&
		(ofs = pbih->biSize) + (cx * cy << 2) == cb
		)
	{
		n = cy / cx, cb = cx * cx << 2;
		if (HIMAGELIST himl = ImageList_Create(cx, cy, ILC_COLOR32, n, 0))
		{
			BITMAPINFO bi = { {sizeof(BITMAPINFOHEADER), cx, cx, 1, 32 } };
			if (HDC hdc = GetDC(0))
			{
				if (HBITMAP hbmp = CreateCompatibleBitmap(hdc, cx, cx))
				{
					do ; while (
						SetDIBits(hdc, hbmp, 0, cx, RtlOffsetToPointer(pbih, ofs), &bi, DIB_RGB_COLORS) &&
						0 <= ImageList_Add(himl, hbmp, 0) &&
						(ofs += cb, --n)
						);
					DeleteObject(hbmp);
				}
				ReleaseDC(0, hdc);
			}
			if (!n) return himl;
			ImageList_Destroy(himl);
		}
	}
	return 0;
}
                                 
        
А вообще, хакер, вылитый хакер. Особенно do ; while - я даже не знал, что так можно.
Нельзя, емнип. Так что это кресты.
Можно в начале любого блока, даже в C89.
Кстати, а это же ничем не отличается от while (...);
Зачем писать уродливые костыли, боясь мифических do, если можно юзать for, как единый цикл с предусловием и не париться?
while (func());
@@1: call func
text rax,rax
jz @@2
jmp @@1
@@2:
--------------------------
do ; while (func());
@@1: call func
text rax,rax
jnz @@1
goto check;
do
{
body;
check:
}
while( func() );
в данном случае тоже есть 1 дополнительная инструкция - jmp check - НО она выполняется только 1 раз, а не в цикле
Ну for же можно. И if. И обычный while.
Я за принудительные операторные скобки и возможно отказ от коварного оператора запятая.
Хотя крестоблядь везде болото найдёт, чтобы в нём застрелиться в ногу.
Я не против того, чтобы не писать скобки там где не нужно. Что мне кажется не хорошо - скобки выполняют две функции (в Си) - лексические блоки, и просто грамматическую функцию объединения нескольких выражений в одно. И иногда используя их ради одной из функций зачем-то получаешь вторую.
Ну есть case без выражений, для того чтобы перечислить несколько значений.
switch(1) {
case 1:case 2:;
}
Да в том-то и дело что тут полная неконсистентность.
>Или тело функции, если в нем всего одно выражение?
>разные Си-подобные к этому по-разному относятся.
Хотя лямбды в C# (x => x+1;), Java (x -> x+1; ) и драфте ECMA6 допускают сахарную запись без фигурных скобок, если там один оператор. Не знаю насчёт крестов, может и там сделали.
Raissya v pirde.