Перейти к содержанию
    

Преобразование не стандартных записей из GNU С в стандарт ISO.

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

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

 

О каких-то записях догадки есть, но это догадки, а хочется быть уверенным в правильности перевода. Что-то есть в гугле.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Где бы почитать о том, как правильно эти особенности обработать?

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

c90 vs c99

 

restrict

и

Не нравится компилятору inline в хедер файле, когда этот хедр включён в *.c файл, в *.cpp ошибок не выдаёт

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

 

Изменено пользователем Idle

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

__attribute__((packed))

В некоторых конфессиях выглядит как #pragma pack

Означает упаковку объекта

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В некоторых конфессиях выглядит как #pragma pack

Означает упаковку объекта

#pragma pack обычно идёт с числом, на сколько выравнивать. А тут выравнивание по умолчанию на 1?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

#pragma pack обычно идёт с числом, на сколько выравнивать. А тут выравнивание по умолчанию на 1?

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

Без упаковки - все одинаково.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С расширениями языка боле-менее разобрался. Вопросы остались по __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 это реализовать. Это в опциях где-то?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...