реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Преобразование не стандартных записей из GNU С в стандарт ISO.
Oleg_IT
сообщение Apr 10 2011, 18:24
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Мало программировал на 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;

И ещё там много всякой мелочи.

О каких-то записях догадки есть, но это догадки, а хочется быть уверенным в правильности перевода. Что-то есть в гугле.
Go to the top of the page
 
+Quote Post
Idle
сообщение Apr 11 2011, 04:30
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 351
Регистрация: 5-04-05
Пользователь №: 3 874



Цитата(Oleg_IT @ Apr 10 2011, 22:24) *
Где бы почитать о том, как правильно эти особенности обработать?

http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_4.html
c90 vs c99

Цитата(Oleg_IT @ Apr 10 2011, 22:24) *
restrict

и
Цитата(Oleg_IT @ Apr 10 2011, 22:24) *
Не нравится компилятору inline в хедер файле, когда этот хедр включён в *.c файл, в *.cpp ошибок не выдаёт

компилируйте как c99


Сообщение отредактировал Idle - Apr 11 2011, 04:39
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Apr 11 2011, 05:27
Сообщение #3


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(Oleg_IT @ Apr 10 2011, 22:24) *
__attribute__((packed))

В некоторых конфессиях выглядит как #pragma pack
Означает упаковку объекта


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Apr 11 2011, 11:37
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Спасибо, надеюсь поможет.

Цитата(Idle @ Apr 11 2011, 08:30) *

Чего-то не открывается у меняsad.gif
Go to the top of the page
 
+Quote Post
Idle
сообщение Apr 11 2011, 13:23
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 351
Регистрация: 5-04-05
Пользователь №: 3 874



Цитата(Oleg_IT @ Apr 11 2011, 15:37) *
Чего-то не открывается у меняsad.gif

http://home.datacomm.ch/t_wolf/tw/c/c9x_changes.html
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Apr 11 2011, 16:24
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



? Дома обе ссылки открылись.
Спасибо.
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Apr 12 2011, 09:43
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Цитата(MrYuran @ Apr 11 2011, 09:27) *
В некоторых конфессиях выглядит как #pragma pack
Означает упаковку объекта

#pragma pack обычно идёт с числом, на сколько выравнивать. А тут выравнивание по умолчанию на 1?
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Apr 12 2011, 09:56
Сообщение #8


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(Oleg_IT @ Apr 12 2011, 13:43) *
#pragma pack обычно идёт с числом, на сколько выравнивать. А тут выравнивание по умолчанию на 1?

char-ы пакуются вплотную, остальное - по границе машинного слова.
Без упаковки - все одинаково.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Apr 17 2011, 14:02
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



С расширениями языка боле-менее разобрался. Вопросы остались по __ESCAPE__. В описании говорят, что этот макрос меняется от реализации компилятора и, что его можно просто опустить, но смысл этого макроса я так и не понял.
Все эти расширения направлены на оптимизацию кода и, пока, достойной замены в VS не вижу.

Не разобрался с av_alias
Цитата(Oleg_IT @ Apr 10 2011, 22:24) *
Есть объявления

Код
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 сделать?

Цитата(Idle @ Apr 11 2011, 08:30) *
компилируйте как c99

Не вижу как в VS это реализовать. Это в опциях где-то?
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 07:48
Рейтинг@Mail.ru


Страница сгенерированна за 0.01446 секунд с 7
ELECTRONIX ©2004-2016