IntelliSense: недопустимое значение спецификатора выравнивания

Я использую последнюю версию 1.5.2 библиотек POCO C++ для проекта, и каждый раз, когда я компилирую свой проект, я получаю указанную выше «ошибку» в коде POCO. Я говорю «ошибка», потому что они отображаются как ошибки, но они не мешают мне компилировать, связывать или выполнять мой проект.

Ошибки появляются в «Foundation/include/poco/alignment.h»:

POCO_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(512);
POCO_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(1024);
POCO_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(2048);
POCO_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(4096);
POCO_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(8192);

Меньшие значения (16, 32, 64, 128) не вызывают ошибок.

У меня есть два вопроса:

  1. Что именно пытается сделать приведенный выше код?
  2. Почему они выдают ошибки и как от них избавиться?

Я строю POCO с помощью buildwin.cmd со следующей конфигурацией:

VS_VERSION 100
ACTION build
LINKMODE static_mt
CONFIGURATION both
PLATFORM Win32

person pqvst    schedule 07.08.2013    source источник


Ответы (1)


Это немного сложно увидеть, не видя фактических «ошибок» (если компиляция прошла успешно, это не ошибки компилятора, но см. ниже), но макрос определяется следующим образом:

#define POCO_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(x) \
    template <> struct AlignedCharArrayImpl<x> \
    { \
        char aligned alignas(x); \
    }
    #define POCO_HAVE_ALIGNMENT
#endif

Другими словами, он пытается создать некоторые определения структуры выравнивания шаблона, такие как AlignedCharArrayImpl<16> и AlignedCharArrayImpl<8192>. Ошибка вероятно связана с передачей неверного выравнивания alignas на основе вашего заголовка Invalid alignment specifier value.

Однако в этом случае ваш код на самом деле не должен компилироваться, поскольку C++11 7.6.2 явно указывает, что неподдерживаемые выравнивания делают программу неправильной. Если не видеть реальных сообщений об ошибках, я не могу помочь с этим конкретным аспектом.

У меня также мало опыта работы с продуктом Microsoft C++ (в основном я использую C#), но эта страница, по-видимому, указывает на "менее полную" поддержку alignas:

Ни Visual C++ 2010, ни Visual C++ в Visual Studio 2012 не реализуют ключевые слова основного языка alignas/alignof из предложения по выравниванию, за которое проголосовали в рабочем документе. В Visual C++ 2010 было выровнено_хранилище из TR1. Visual C++ в Visual Studio 2012 добавляет в стандартную библиотеку linear_union и std::align().

Я не знаю, изменилось ли что-нибудь с тех пор, как это было опубликовано, но есть как минимум один отчет об ошибке об отсутствии поддержки этой функции, которая была закрыта как отложенная (имеется в виду, предположительно, еще не исправленная) . Так что это может быть это, которое вызывает ваши проблемы.


И, основываясь на вашем комментарии о том, что только Intellisense жалуется на выравнивание, я полагаю, что это было описано в это сообщение об ошибке:

Мы используем отдельные компиляторы для IntelliSense и сборки, и, к сожалению, они не согласны с верхним пределом для выравнивания.

Другими словами, если ваш компилятор компилирует его, вы можете спокойно игнорировать ошибку Intellisense. Судя по всему, определение IDE от Microsoft не такое уж «интегрированное», как мы привыкли ожидать :-)

person paxdiablo    schedule 07.08.2013
comment
Интересно то, что фактические сообщения об ошибках буквально представляют собой IntelliSense: недопустимое значение спецификатора выравнивания, которое, по-видимому, указывает на то, что это какая-то ошибка IDE, а не ошибка сборки/компилятора. Выходные данные сборки компилятора не выдают ничего, связанного с этими ошибками. - person pqvst; 07.08.2013
comment
@pbergqvist, см. обновление, Intellisense и компилятор не обязательно соглашаются с верхним пределом выравнивания. - person paxdiablo; 07.08.2013