【问题标题】:What is the deal about "extension" in "Nested functions are supported as an extension in GNU C"?“在 GNU C 中支持嵌套函数作为扩展”中的“扩展”是什么意思?
【发布时间】:2016-03-28 13:18:41
【问题描述】:

online manual,我可以看到,

GNU C 支持嵌套函数作为扩展,但 GNU C++ 不支持。

这是什么意思?如何获得该扩展程序?

【问题讨论】:

  • 请记住,这个特定的扩展要求堆栈是可执行的,这破坏了一个重要的安全机制,并且可能使您的程序更容易受到攻击。
  • @FUZxxl 请确定上述声明的来源。这将有助于进一步阅读。
  • gcc 使用trampolines 实现指向嵌套函数的指针,深入解释here 并要求堆栈可执行。
  • 要获得这个扩展,不要使用-std=cXX开关

标签: c function gcc standards


【解决方案1】:

您不需要获取扩展。这是GNU C 编译器中嵌入的一个功能。

FWIW,这里的 extension 指向 C 标准的扩展。详细来说,来自online manual

6 .扩展

GNU C 提供了 ISO 标准 C 中没有的几种语言特性。(如果使用了这些特性中的任何一个,-pedantic 选项会指示 GCC 打印一条警告消息。)要测试这些特性在条件编译中的可用性,请检查对于预定义的宏 GNUC,它总是在 GCC 下定义。

【讨论】:

    【解决方案2】:

    每个 C 编译器都支持该语言的一个或多个版本,可以是标准版本或非官方版本。例如,GCC 支持三个版本的标准,见https://gcc.gnu.org/onlinedocs/gcc/Standards.html#Standards

    此外,GCC supports so-called extensions,该语言的附加功能,可能为了开发人员的方便而存在,或者为了测试可能使其成为官方 C 标准更高版本的实验性功能。这些扩展默认是启用的,所以不需要安装额外的包,它们只是编译器本身的一个组成部分。

    这些扩展应该只在特定编译器是项目唯一受支持的目标时才使用。开发人员通常优先考虑可移植性和符合标准,以最大限度地提高代码库的可维护性。

    关于这个特定的特性,重要的是要注意 C++11 添加了对 lambda 函数的支持,这可能证明了 G++ 中缺乏对这个扩展的支持,因为它们会发生冲突而没有任何额外的好处。

    【讨论】:

    • “每个 C 编译器都符合该语言的一个或多个版本。”——如果这是真的,那就太好了。
    • @FUZxxl 至少他们会尝试 :) 请注意,我并没有说他们符合 standard 的版本。例如,嵌入式 C 编译器可能支持标准的非官方子集。我仍然认为这是一种语言的版本
    • @FUZxxl:不,如果编译器支持扩展,那么编译器的用户会倾向于编写仅适用于该编译器的代码。 (我认为Apple从某些编译器版本中删除了嵌套函数,并发现该功能共有八种用途,都可以轻松替换为非嵌套函数。
    • @SirDarius 你不能说 conforms to 如果你不是在谈论一些规范。
    • @M.M 当然你是对的,但规范不一定是标准。为了更清楚,我可以改写一下。
    【解决方案3】:

    1st.您提到的链接是针对当前 GCC 开发版本的。目前是 v6.0.0。我认为您并没有真正使用它。您很可能正在运行一些 v4 或 v5 编译器。试试gcc -v查看。

    2nd. GCC has a few command line options 控制您愿意使用的确切“方言”。在特定情况下,嵌套函数不在任何当前标准(AFAIK)中,因此您需要确保选择 GNU 方言。默认名称为gnu89,即“ISO C90(包括一些 C99 功能)”。选项-std=gnu11 应该选择“最先进的方言”™。不过,强烈建议您完整阅读文档。

    3rd.一旦你知道你正在运行哪个版本,你可以去相关的在线文档并检查“Extensions to the C Language Family”(我以v4.9.3为例)是否扩展是可用的,实际上是什么。

    我会说,就是这样。

    【讨论】:

      猜你喜欢
      • 2017-06-29
      • 1970-01-01
      • 2015-07-09
      • 1970-01-01
      • 2022-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-23
      相关资源
      最近更新 更多