Вопрос

Я пытаюсь использовать аннотацию SAL от Micosoft для своего проекта, однако я получаю следующее предупреждение, и я не знаю почему.

В качестве примера я создал новое консольное приложение на C ++, и у меня есть этот код:

#include <sal.h>

class Whatever
{
public:
    _Check_return_ int Method(__in int number) ;
};

int main()
{
    return 0;
}

Когда я компилирую с помощью Visual Studio 2008, я получаю следующее предупреждение:

предупреждение C6540:Использование аннотаций атрибутов в этой функции приведет к аннулированию всех ее существующих аннотаций __declspec

В файле "c1xxast"

Что я делаю не так?Если я удалю либо _Check_return_ или тот __in, предупреждение исчезает.

Я не могу найти никакой ссылки на предупреждение C6550.Однако тот же текст можно найти здесь: http://msdn.microsoft.com/en-us/library/dd445322.aspx, но это не очень помогает.

Это было полезно?

Решение

Проблема может быть в том, что вы смешиваете типы аннотаций SAL.Хотя в MSDN это очень четко указано, существует два типа аннотаций SAL:атрибут и ...er ...нет.

Тот Самый #defineы в <sal.h> VC2005 использует версии без атрибутов и начинается с символа подчеркивания, за которым следует нижний регистр письмо.Более новые версии VC2008 расширяются до атрибутов компилятора и начинаются (и заканчиваются) символом подчеркивания, за которым следует капитал письмо.

Вы смешали эти два типа:

Атрибут:

  • _ В_
  • _check_ возврат_

Не являющийся атрибутом:

  • __ в
  • __ Проверка возврата

Попробуйте изменить свои аннотации, чтобы последовательно использовать один тип.

Это сообщение в блоге объясняет немного больше об этом.

Другие советы

Вы должны добавить аннотации SAL как в объявление, так и в определение метода. Я предполагаю, что SAL расстроен, потому что он не может найти определение метода и предполагает, что атрибуты отсутствуют.

РЕДАКТИРОВАТЬ Разъяснение

Аннотации SAL должны появляться в обоих местах для неабстрактных методов. Для абстрактных методов SAL не будет искать определения. В некоторых конфигурациях это фактически гарантирует, что реализация интерфейса имеет соответствующие обозначения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top