что означает фраза Код (Text): __pragma(warning(push)) __pragma(warning(disable : 4548)) do {__noop(TagBase);} while((0,0) __pragma(warning(pop)) ); из __forceinline DWORD HEAP_MAKE_TAG_FLAGS ( DWORD TagBase, DWORD Tag ); тестово компилится в Код (Text): 00411A24 33 C0 xor eax,eax 00411A26 75 FC jne 411A24h точнее, какой семантический смысл имеет участок "(0,0)"? отдельно записанный он не дает кода
valterg никакого. а и если false, то как получается такой компиль? еах нигде до xor eax,eax не устанавливается. __noop по мсдн - "не компилить". да и в чем смысл таких маш команд?? всетаки хотелось бы не гадать (зачем именно так, как зовется эта операция) а узнать както..
В исходном коде до препроцессора функция HEAP_MAKE_TAG_FLAGS смотрится вот так: Код (Text): FORCEINLINE DWORD HEAP_MAKE_TAG_FLAGS ( IN DWORD TagBase, IN DWORD Tag ) { __assume_bound(TagBase); return ((DWORD)((TagBase) + ((Tag) << HEAP_TAG_SHIFT))); } Вопрос, собственно, относится к __assume_bound. Это часть того, что MS называет SAL annotations (в списке в описании этого нет, но в h-файлах все объявления с комментариями собраны в specstrings*.h) и что в зависимости от разных факторов может раскрываться в нечто с __declspec("SAL_*") либо быть макросом, который поймёт любой ANSI компилятор. Ну а трюк с do / while (0) - стандартная вещь для того, чтобы макрос (который подставляется препроцессором, который понятия не имеет о синтаксисе языка) синтаксически вёл себя как обычная функция - например, описано здесь: http://stackoverflow.com/questions/154136/why-are-there-sometimes-meaningless-dowhile-and-ifelse-statements-in-cc-macros .