如果启用了模块,则tgmath.h不起作用


69

在处理arm64时,我考虑使用tgmath.h来处理CGFloat typedef float/double混乱。

这个答案对如何使用它有很好的描述,除了它对我一点都不起作用。无论如何,我的代码仍在调用math.h函数。

花了一些时间查看所有项目编译器设置后,我发现禁用“模块”功能(@import vs #import-iOS 7)可以使所有功能正常工作。更具体地说,在项目设置中的选项被称为Enable Modules(C and Objective-C)Apple LLVM 5.1 - Language - Modules下拉列表中。

要查看此问题的快速示例,请下载使用tgmath的项目,例如MBProgressHUD,并查看启用模块项目设置时会发生什么。该tgmath.h呼叫会被替换成普通math.h电话。

我的问题是:

  1. 为什么模块会阻止tgmath正确导入?

  2. 有没有一种解决方法,可以同时使用tgmath和模块?我仍然希望能够使用它们。


5
在我看来,这似乎是一个编译器错误,您应该在bugreporter.apple.com上报告它-Martin
R

1
是的,请这样做,并让我们知道错误号。
Flash Sheridan

3
我想了很多,谢谢。我提交了雷达问题,并将其发布在openradar上。这是openradar链接:openradar.me/16744288
Dima

6
目前,一个肮脏的解决方法是在导入thmath.h之后立即为每个thmath函数复制#undef和#define宏对。我在.pch文件中执行此操作,以便在整个应用程序中访问这些帮助程序。
Matej Bukovinski 2014年

3
谢谢; 工程师一直在调查潜在问题,但恐怕我无法给出修复时间。
Flash Sheridan 2014年

Answers:


3

我不知道是什么引起了这个问题,但是作为一种解决方法,您至少可以仅针对正在使用的文件禁用模块tgmath.h

  • 导航到Xcode中目标的Build Phases选项卡。
  • 在“编译源”阶段下,找到源文件。
  • 双击源文件,然后键入-fno-modulesCompiler Flags弹出框以禁用该文件的Clang模块。

至少通过这种方式,您仍将在大多数项目中获得模块的好处。(当然,这是假设您不需要tgmath.h大多数源文件。)


不幸的是,感谢您的贡献,这在具有数百个文件的项目中是一种耗时的解决方案。
迪马

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.