今日、 のような関数指定子に出くわしたとき、OpenCL の学習を開始しました_kernel
。検索したところ、 のような関数指定子がたくさん見つかりまし_inline
_noreturn
た。関数指定子とは何か、またその用途は何ですか? 私は多くの C プログラミングの本を読みましたが、そのような用語を見つけたことがありませんか?
_Noreturn
上記の指定子は に似ていvoid
ますか?
私は完全な機械可読 C11 文法 (GNU 拡張機能付き) を持っています。
ここで関連部分を引用します:
function-definition:
declaration-specifiers_opt declarator declaration-list_opt compound-statement
declaration-specifiers:
storage-class-specifier declaration-specifiers_opt
type-specifier declaration-specifiers_opt
type-qualifier declaration-specifiers_opt
function-specifier declaration-specifiers_opt
alignment-specifier declaration-specifiers_opt
attributes declaration-specifiers_opt
function-specifier:
inline
_Noreturn
他のコンパイラ/言語用の新しい文法を追加するためのプル リクエストを受け入れます。他の誰かがそれらを収集していることに気付いていないからです。
C11 (ISO/IEC 9899:2011) に精通した本が必要です。キーワードは、 (C99 または ISO/IEC 9899:1999 で追加された_Noreturn
) のような新しい関数指定子です。inline
のような型 (または型の不在) ではありませんvoid
。 _Noreturn
関数が戻らないことを意味します。たとえば、C11 標準でexit()
は、これは返さない関数であると宣言されています。
#include <stdlib.h>
_Noreturn void exit(int status);
<stdnoreturn.h>
を提供するヘッダーもあります。
#define noreturn _Noreturn
_Noreturn
この名前は、実装用に予約された名前空間からのものであることに注意してください。この名前noreturn
はユーザーによって使用された可能性があります。壊れたコード_Noreturn
は、実装用に予約された名前空間をすでに悪用していました。
__attribute__((noreturn))
また、GCCなどのコンパイラ固有のメカニズムを使用する古いコードも見つかります。
一般に、関数指定子は、直接関数の型ではない関数に関するプロパティを識別します。たとえばinline
、関数がインライン化に適している可能性があるという意味があります — これは、コンパイラ/オプティマイザへのヒントです。同様に_Noreturn
、関数が呼び出された場合、呼び出し元のコードに制御が戻らないというコンパイラ/オプティマイザへのヒントです。