【问题标题】:C what is a function specifier? like _inline _NORETURNC 什么是函数说明符?像 _inline _NORETURN
【发布时间】:2015-07-06 02:08:15
【问题描述】:

今天我开始学习 OpenCL,因为我遇到了像 _kernel 这样的函数说明符。比我搜索它,我发现了很多函数说明符,比如_inline_noreturn。我想知道什么是函数说明符以及它的用途是什么?我读过很多 C 编程书籍,但从未找到过这样的术语?

_Noreturn 

上面的说明符和void类似吗?

【问题讨论】:

  • 请注意,_inline_noreturn 是实际的 C 关键字,_kernel 是 OpenCL 定义的。它与您的操作系统的运行时无关——实际上它在显卡上运行。
  • @Blindy:_inline_noreturn 都不是 C 关键字;关键字是inline_Noreturn
  • 这是语义,它们直接匹配。我的意思是 _kernel 与 OP 所暗示的不在同一类别中。

标签: c function opencl specifier


【解决方案1】:

Here's a good link explaining function specifiers

我引用了一段更准确地回答您的具体问题的摘录:

_Noreturn (C11 起) - 指定函数不会返回到调用它的位置。

【讨论】:

    【解决方案2】:

    您需要一本熟悉 C11 (ISO/IEC 9899:2011) 的书。关键字_Noreturn 是一个新的函数说明符,如inline(在C99 或ISO/IEC 9899:1999 中添加)。它不是void 的类型(或没有类型)。 _Noreturn 表示函数不返回。例如,C11 标准声明 exit() 是一个不返回的函数:

    #include <stdlib.h>
    _Noreturn void exit(int status);
    

    还有一个标题&lt;stdnoreturn.h&gt;,它提供了

    #define noreturn _Noreturn
    

    请注意,名称_Noreturn 来自为实现保留的命名空间;名称noreturn 可能已被用户使用。任何被_Noreturn 破坏的代码已经在滥用为实现保留的命名空间。

    您还会发现使用编译器特定机制的旧代码,例如 GCC 中的 __attribute__((noreturn))

    一般来说,函数说明符标识函数的不直接属于函数类型的属性。例如,inline 暗示该函数可能适合内联——它是对编译器/优化器的提示。同样,_Noreturn 是对编译器/优化器的提示,即如果调用该函数,控制将永远不会返回到调用代码。

    【讨论】:

      【解决方案3】:

      我有一个full machine-readable C11 grammar (with GNU extensions)

      在此引用相关部分:

      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
      

      我会接受为其他编译器/语言添加新语法的拉取请求,因为我不知道有其他人收集它们。

      【讨论】:

        猜你喜欢
        • 2012-03-14
        • 2019-10-29
        • 2016-07-06
        • 2016-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多