Сейчас на форуме: UniSoft, bartolomeo (+6 невидимых) |
eXeL@B —› Программирование —› нестандартное поведение препроцессора msvc |
Посл.ответ | Сообщение |
|
Создано: 23 января 2011 14:40 · Личное сообщение · #1 дано: #define __drv_out(annotes) __post __$drv_group(##__drv_nop(annotes)) макрос используется например из етого места Code:
вопрос: что сделает первее pp msvc - раскроет макрос __drv_nop или выполнит склеивание? |
|
Создано: 26 января 2011 05:22 · Личное сообщение · #2 На сколько мне известно, препроцессор С так до конца и не стандартизировали. По идее, на мой взгляд (и, похоже, наивным ожиданиям),оно должно тупо подставляться согласно скобкам, т.е. первым должна идти склейка. С другой стороны, я никогда не был действительным разработчиком, но уже повидал 100500 багов в самых промышленных компиляторах. Компилеры тоже люди пишут, как не крути. |
|
Создано: 26 января 2011 07:13 · Поправил: Jonny · Личное сообщение · #3 Спасибо за ответ. Со стандартизацией там в порядке. например и в 9899:1990(5.1.1.2), и в 9899:1999(5.1.1.2) трансляция исходного кода состоит из 8 шагов, где первые 6 касаются исключительно препроцессора. На 7 шаге токены препроцессора превращаются в токены лексического анализатора. А то что нас касается, выполняется на шаге 4, где происходит раскрытие макросов и выполнение директив препроцессора. На входе который принимает исключительно токены препроцессора(pp-tokens). Определения pp-tokens указаны в главе 6.4 Code:
Скорее всего, у pp msvc после склейки ошибка в алгоритме последующих действий. во - первых, по стандарту полученная строка должна являться pp-token`ом. В реализации строка заново сканируется(проходит шаги трансляции от 1 до 3). если на выходе после этого не формируется pp-token или формируется больше 1 токена - ошибка. Вообщем, я прихожу к выводу, что pp msvc не проверяет количество полученных токенов после сканирования склеенной строки. Практически, данная ошибка встречается в файле windows psdk drvspecs.h |
|
Создано: 26 января 2011 07:35 · Поправил: Jonny · Личное сообщение · #4 Также есть следующий общеизвестный баг msvc pp. psdk : WTypes.h Code:
если используется ms компилятор, у которого определено ключевое слово bool, то после макроподстановки _VARIANT_BOOL bool; (Propidl.h, OAidl.h) получается комментарий. Но если смотреть с точки зрения стандарта, то после склейки мы должны получить pp-token, но `//` в их число не входит. |
|
Создано: 28 января 2011 05:13 · Поправил: DrGolova · Личное сообщение · #5 Размер типа "bool" так никто и не удосужился стандартизировать. Причем в MS компилере сей тип ведет себя по разному в з0висимости от окружения. Если это С++, то bool - это 1 байт, а если это ANSI-C - то это int (бага/фича компилера? в оригинальном C вобще нет типа bool, хотя все они понимают его без всяких редефайнов) посему все, кто пробуют использовать данный тип в публичных интерфейсах (а уж тем более в структурах), подвергаются анальной каре, и увольняются нахуй без права голоса. Это я типа про всякие титан-энжины, на сорцы которых без слез невозможно смотреть. |
|
Создано: 28 января 2011 15:57 · Поправил: redlord · Личное сообщение · #6 DrGolova пишет: бага/фича компилера? в оригинальном C вобще нет типа bool, хотя все они понимают его без всяких редефайнов ISO/IEC 9899:1999: 1 The header <stdbool.h> defines four macros. 2 The macro bool expands to _Bool. An object declared as type _Bool is large enough to store the values 0 and 1. The type _Bool and the unsigned integer types that correspond to the standard signed integer types are the standard unsigned integer types. а с размером - плохо |
|
Создано: 28 января 2011 16:07 · Личное сообщение · #7 |
|
Создано: 28 января 2011 16:13 · Личное сообщение · #8 cppasm пишет: размер явно не указан ни для одного из базовых типов An object declared as type signed char occupies the same amount of storage as a ‘‘plain’’ char object. A ‘‘plain’’ int object has the natural size suggested by the architecture of the execution environment (large enough to contain any value in the range INT_MIN to INT_MAX as defined in the header <limits.h>). сложно сказать |
eXeL@B —› Программирование —› нестандартное поведение препроцессора msvc |