NOTE インタフェースは、コンパイル後のオブジェクトコードに影響を与えることなく、ソースコードへのロック lint 用の情報の挿入を可能にします。ノート形式の注釈の基本構文は、以下のどちらかです。
NOTE(NoteInfo)
または
_NOTE(NoteInfo)
そして、_NOTE よりも NOTE のほうが一般的に好まれています。ただし、複数の関連しないプロジェクトにおいて使用されるヘッダーファイルでは、混乱を避けるために _NOTE を使用してください。NOTE がすでに使用され、それを変更したくない場合は、_NOTE を使ってほかのマクロ (ANNOTATION など) を定義してください。たとえば、以下の内容を含むインクルードファイル (annotation.h とします) を定義できます。
#define ANNOTATION _NOTE #include <sys/note.h>
NOTE インタフェースに渡される NoteInfo は、書式上は以下のいずれかの形式に一致しなければなりません。
NoteName
NoteName(Args)
NoteName は、注釈の種類を示す単なる識別子です。トークンとして正しく、カッコのトークンが適合してさえいれば (閉じカッコが存在する)、Arg は何でもかまいません。それぞれの個別の NoteName は、引数に関して、独自の要求事項を持つことになります。
このマニュアルでは、特にことわり書きがない限り、NOTE は NOTE と _NOTE の両方を指します。
NOTE は、ソースコード中の、特定の定義済みの箇所においてのみ有効です。
トップレベル:すべての関数定義、type および struct 定義、変数宣言、その他の 構文の外側。以下に例を示します。
struct foo { int a, b; mutex_t lock; }; NOTE(MUTEX_PROTECTS_DATA(foo::lock, foo)) bar() {...}
宣言あるいはステートメント中のブロック内のトップレベル。この場合も、注釈はすべての type および struct 定義、変数宣言、その他の構文の外側でなければなりません。
foo() { ...; NOTE(...) ...; ...; }
NOTE() は、前述の場所でのみ使用されます。たとえば、以下の場所での使用は正しくありません。
a = b NOTE(...) + 1;
typedef NOTE(...) struct foo Foo;
for (i=0; NOTE(...) i<10; i++) ...
ノート形式の注釈はステートメントではありません。つまり、NOTE() は、ブロックを構成するために中括弧が使用されない限り、if/else/for/while 本文の内側では使用してはなりません。たとえば、以下の表記は構文エラーを引き起こします。
if (x)
NOTE(...)