вопрос по синтаксису мсвс (2008)

Тема в разделе "LANGS.C", создана пользователем qqwe, 13 окт 2009.

  1. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    что означает фраза

    Код (Text):
    1. __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):
    1. 00411A24 33 C0            xor         eax,eax
    2. 00411A26 75 FC            jne        411A24h
    точнее, какой семантический смысл имеет участок "(0,0)"? отдельно записанный он не дает кода
     
  2. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    (0,0) - по контексту и коду похоже на false. Какой отдельно он может дать код ?
     
  3. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    valterg
    никакого.

    а и если false, то как получается такой компиль? еах нигде до xor eax,eax не устанавливается. __noop по мсдн - "не компилить". да и в чем смысл таких маш команд??

    всетаки хотелось бы не гадать (зачем именно так, как зовется эта операция) а узнать както..
     
  4. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    В исходном коде до препроцессора функция HEAP_MAKE_TAG_FLAGS смотрится вот так:
    Код (Text):
    1. FORCEINLINE
    2. DWORD
    3. HEAP_MAKE_TAG_FLAGS (
    4.     IN DWORD TagBase,
    5.     IN DWORD Tag
    6.     )
    7.  
    8. {
    9.     __assume_bound(TagBase);
    10.     return ((DWORD)((TagBase) + ((Tag) << HEAP_TAG_SHIFT)));
    11. }
    Вопрос, собственно, относится к __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 .