Oleg_IT 0 10 апреля, 2011 Опубликовано 10 апреля, 2011 · Жалоба Мало программировал на GNU С. Тут столкнулся с необходимостью перевода текста написанного для GNU на Visual Studio. Столкнулся с особенностями, отличиями от ISO. Где бы почитать о том, как правильно эти особенности обработать? Примеры особенностей __attribute__((packed)) __attribute__((__nonnull__(1,2))) __pure __attribute__((packed)) __ESCAPE__ restrict Не нравится компилятору inline в хедер файле, когда этот хедр включён в *.c файл, в *.cpp ошибок не выдаёт static inline unsigned int CMP___(unsigned int a, unsigned int b) { return (unsigned int)(a < b); } В объявление функции аргумент указатель на структуру. Компилятор выдаёт ошибку 1>d:\MyProj\util.h(582) : error C2373: 'cmp_func' : redefinition; different type modifiers… Есть объявления typedef union { uint64_t u64; uint32_t u32[2]; uint16_t u16[4]; uint8_t u8 [8]; double f64; float f32[2]; } av_alias av_alias64; typedef union { uint32_t u32; uint16_t u16[2]; uint8_t u8 [4]; float f32; } av_alias av_alias32; typedef union { uint16_t u16; uint8_t u8 [2]; } av_alias av_alias16; Компилятору не нравится повторение av_alias. av_alias используется в записи union unaligned_64 { uint64_t l; } __attribute__((packed)) av_alias; И ещё там много всякой мелочи. О каких-то записях догадки есть, но это догадки, а хочется быть уверенным в правильности перевода. Что-то есть в гугле. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Idle 0 11 апреля, 2011 Опубликовано 11 апреля, 2011 (изменено) · Жалоба Где бы почитать о том, как правильно эти особенности обработать? http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_4.html c90 vs c99 restrict и Не нравится компилятору inline в хедер файле, когда этот хедр включён в *.c файл, в *.cpp ошибок не выдаёт компилируйте как c99 Изменено 11 апреля, 2011 пользователем Idle Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 16 11 апреля, 2011 Опубликовано 11 апреля, 2011 · Жалоба __attribute__((packed)) В некоторых конфессиях выглядит как #pragma pack Означает упаковку объекта Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Oleg_IT 0 11 апреля, 2011 Опубликовано 11 апреля, 2011 · Жалоба Спасибо, надеюсь поможет. c90 vs c99 Чего-то не открывается у меня:( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Idle 0 11 апреля, 2011 Опубликовано 11 апреля, 2011 · Жалоба Чего-то не открывается у меня:( http://home.datacomm.ch/t_wolf/tw/c/c9x_changes.html Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Oleg_IT 0 11 апреля, 2011 Опубликовано 11 апреля, 2011 · Жалоба ? Дома обе ссылки открылись. Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Oleg_IT 0 12 апреля, 2011 Опубликовано 12 апреля, 2011 · Жалоба В некоторых конфессиях выглядит как #pragma pack Означает упаковку объекта #pragma pack обычно идёт с числом, на сколько выравнивать. А тут выравнивание по умолчанию на 1? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 16 12 апреля, 2011 Опубликовано 12 апреля, 2011 · Жалоба #pragma pack обычно идёт с числом, на сколько выравнивать. А тут выравнивание по умолчанию на 1? char-ы пакуются вплотную, остальное - по границе машинного слова. Без упаковки - все одинаково. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Oleg_IT 0 17 апреля, 2011 Опубликовано 17 апреля, 2011 · Жалоба С расширениями языка боле-менее разобрался. Вопросы остались по __ESCAPE__. В описании говорят, что этот макрос меняется от реализации компилятора и, что его можно просто опустить, но смысл этого макроса я так и не понял. Все эти расширения направлены на оптимизацию кода и, пока, достойной замены в VS не вижу. Не разобрался с av_alias Есть объявления typedef union { uint64_t u64; uint32_t u32[2]; uint16_t u16[4]; uint8_t u8 [8]; double f64; float f32[2]; } av_alias av_alias64; typedef union { uint32_t u32; uint16_t u16[2]; uint8_t u8 [4]; float f32; } av_alias av_alias32; typedef union { uint16_t u16; uint8_t u8 [2]; } av_alias av_alias16; Компилятору не нравится повторение av_alias. av_alias используется в записи union unaligned_64 { uint64_t l; } __attribute__((packed)) av_alias; Как это в VS сделать? компилируйте как c99 Не вижу как в VS это реализовать. Это в опциях где-то? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться