【问题标题】:Nested Functions on Android NDKAndroid NDK 上的嵌套函数
【发布时间】:2012-05-21 14:23:54
【问题描述】:

有没有办法在 Android NDK 上使用嵌套函数?应该是可以的,因为NDK用的是gcc吧?

好吧,我尝试在 main 中定义一个函数,但编译器根本无法识别它。 这是错误

错误:在 '{' 标记之前不允许函数定义 错误:输入末尾应为“}”

【问题讨论】:

  • 问题不清楚。请清楚说明您要做什么,如果失败,请记录日志。
  • 你已经尝试了什么?您是否尝试过任何来自 NDK 的示例项目?应该相对容易在方法中获取一些代码,甚至从示例项目中获取 main() 并嵌套它以查看会发生什么......
  • 也请看看这个帖子:stackoverflow.com/questions/2929281/…

标签: android gcc android-ndk nested-function


【解决方案1】:

嵌套函数需要一个可执行堆栈,在 Android 中默认禁用该堆栈。

我花了难以置信的时间才弄明白 - 但您需要将以下内容添加到您的 CFLAGS 中:

-z execstack -Wa,--execstack

一切顺利!

【讨论】:

    【解决方案2】:

    来自here 的嵌套函数示例,其中foo() 包含square(),编译并运行良好(在 Tegra 3 上)。我使用 NDK r8 android 工具链(使用 android-cmake,如果这有什么不同,那不应该是这种情况)。如果您使用旧版本,也许您应该尝试使用 r8?

    【讨论】:

      【解决方案3】:

      我不太清楚。但就 NDK 使用arm gcc 编译器而言,嵌套函数可能在ARM architecture 上被破坏 - 我最好的猜测是嵌套函数可能在 NDK 工具集中被禁用。无论如何 - 嵌套函数是 GCC 扩展,因此如果您希望代码可移植,最好不要使用 gcc 扩展,而是使用 C89/C90 兼容代码。

      【讨论】:

      • 以防万一有人想知道,我用仿函数替换了它们。
      【解决方案4】:

      是的,应该可以。您可能需要在 gcc 调用中添加 -fnested-functions 标志。

      【讨论】:

      • 我尝试将 -fnested-functions 添加到 LOCAL_CFLAGS,但编译器似乎无法识别此标志。吐出错误:无法识别的命令行选项“-fnested-functions”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多