0

今日、 のような関数指定子に出くわしたとき、OpenCL の学習を開始しました_kernel。検索したところ、 のような関数指定子がたくさん見つかりまし_inline _noreturnた。関数指定子とは何か、またその用途は何ですか? 私は多くの C プログラミングの本を読みましたが、そのような用語を見つけたことがありませんか?

_Noreturn 

上記の指定子は に似ていvoidますか?

4

3 に答える 3

2

これは、関数指定子を説明する良いリンクです

あなたの特定の質問により正確に答える抜粋を引用しました:

_Noreturn (C11 以降) - 関数が呼び出された場所に戻らないことを指定します。

于 2015-07-06T02:16:07.620 に答える
0

私は完全な機械可読 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

他のコンパイラ/言語用の新しい文法を追加するためのプル リクエストを受け入れます。他の誰かがそれらを収集していることに気付いていないからです。

于 2015-07-06T02:37:35.583 に答える
0

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、関数が呼び出された場合、呼び出し元のコードに制御が戻らないというコンパイラ/オプティマイザへのヒントです。

于 2015-07-06T02:12:00.497 に答える