Предупреждение о странной аннотации к SAL
-
19-08-2019 - |
Вопрос
Я пытаюсь использовать аннотацию 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 не будет искать определения. В некоторых конфигурациях это фактически гарантирует, что реализация интерфейса имеет соответствующие обозначения.