Компиляция кода gcc в Visual Studio вызывает ошибку C3646: '__attribute__': неизвестный спецификатор переопределения

Я получаю следующую ошибку:

ошибка C3646: '__attribute__': неизвестный спецификатор переопределения

Код:

LEMUR_PREALIGN char _stack[ sizeof(_Type) * _Count ] LEMUR_POSTALIGN;

Полная ошибка:

1>c:\program files\indri\indri 5.9\include\indri\greedy_vector(52): ошибка C3646: '__attribute__': неизвестный спецификатор переопределения

Дополнительная информация: я пытаюсь использовать indri.lib в проекте Visual Studio.


person Asim Saeed    schedule 03.10.2015    source источник
comment
Не могли бы вы предоставить свой код, над которым работаете? Это должно быть MCVE.   -  person MikeCAT    schedule 03.10.2015
comment
И ваш заголовок и вопрос имеют разные сообщения об ошибках.   -  person Christian Hackl    schedule 03.10.2015


Ответы (1)


Команда __attribute__ — это специальная команда компилятора для gcc. И он используется в строке 52 этого файла. с помощью команды ((align)), которая:

Указывает минимальное выравнивание (в байтах) для переменных указанного типа

На самом деле в Visual Studio есть аналогичная команда выравнивания: align. Но есть две проблемы:

  1. __declspec(align(#)) не поддерживает поведение по умолчанию: __attribute__ ((aligned)), которое будет:

Выровняйте тип по максимально полезному выравниванию для целевой машины, для которой вы компилируете

  1. __declspec(align(#)) — префикс. __attribute__((aligned(#))) является суффиксом. Это означает, что ваш фактический код должен отличаться от места размещения:

struct S { short f[3]; } __attribute__ ((aligned)); // gcc alignment definition __declspec(align(16)) strict S { short f[3]; }; // MSVC alignment

Дело в том, что вам, вероятно, будет лучше #ifdefобработать компилятором любую строку, которая использует __attribute__ ((aligned)), и приготовить собственную __declspec(align(#)).

Для получения дополнительной информации см.: упаковка и выравнивание классов GCC и MSVC


После небольшого изучения lemur_platform.h похоже, что код уже сделал всю вышеперечисленную работу за вас! Вы заметите, что #define LEMUR_POSTALIGN __attribute__ ((aligned)) завернуто в #ifndef WIN32. Итак, что вам нужно сделать, это определить WIN32 в вашем проекте Visual Studio!

person Jonathan Mee    schedule 03.10.2015
comment
если я не ошибаюсь, я думаю, что win32 автоматически определяется в проекте Visual Studio. или есть какой-то конкретный способ определить win32? - person Asim Saeed; 03.10.2015
comment
@AsimSaeed Я думаю, вы имеете в виду _WIN32, который всегда определяется. Вам нужно определить WIN32. Я бы рекомендовал использовать аргументы препроцессора, чтобы вы могли поместить их в код проекта, а не в код. Для этого используйте директиву \D. - person Jonathan Mee; 03.10.2015