Странное SAL аннотации предупреждение - PullRequest
3 голосов
/ 17 марта 2009

Я пытаюсь использовать аннотацию 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,, но это не очень полезно.

Ответы [ 2 ]

10 голосов
/ 21 марта 2009

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

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

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

Атрибут:

  • _In_
  • _Check_return_

Non-атрибут:

  • __ в
  • __ checkReturn

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

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

1 голос
/ 17 марта 2009

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

РЕДАКТИРОВАТЬ Уточнение

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

...