【问题标题】:math.h Included by Default in Objective-C在 Objective-C 中默认包含 math.h
【发布时间】:2012-08-09 19:11:20
【问题描述】:

我有一个多平台项目,目前在 Windows、Linux 和 iOS 上运行,但我偶然发现了 Objective-C 的一个不良问题。

不幸的是,我为我的一种类型选择了名称exp(表达式,考虑到我的代码中出现的次数非常合理),但Objective-C默认包含math.h标头,创建一个名字冲突。

我尝试注释掉 .pch 中的所有内容(每个源文件之前默认包含的前缀文件),exp 仍被标记为重新定义。

有人知道如何在 Objective-C 项目的源文件中包含 math.h 吗?

【问题讨论】:

  • 打电话给你的类型Expr,不要再担心math.h
  • 同意@JimBalter(使用表达式)。此外,当编译器有符号名称长度限制时,我正在编码,由于符号名称长度有限,我们不得不担心名称冲突。然而,现在根本没有任何借口可以使用单词的一小部分作为符号。所以,我永远不会认为“exp”是表达式的合理类型。根据编码风格,有效的替代方案是:表达式、表达式_t、表达式,但可能只在命名空间内。如果没有命名空间,它们都应该加上一些合理的前缀:例如,XIXIXAO_Expression。
  • 我很欣赏 cmets,但我知道我可以(并且确实)简单地重命名类型。我对解决方法感兴趣的原因是我们有一个非常好的命名约定(还有其他类型和函数名称绑定到这个exp),这似乎违反了 Objective-C 直接编译 C99 代码的承诺.

标签: objective-c include


【解决方案1】:

Objective-C 没有正式的规范,但它继承了 C 的特性。在 C 中,程序不应使用标准头文件中的标识符,即使它们不包含这些头文件。所以,你不应该使用“exp”作为你自己的标识符。

如果您坚持使用“exp”,您也许可以使用预处理器语句解决该问题:

#define exp MyExp

这将允许您在源代码中编写“exp”,就好像它是您的标识符之一一样。由于预处理器会将其更改为“MyExp”,因此编译器会将“MyExp”视为标识符并且不会报错。

这将导致许多问题,例如标识符在目标代码信息和调试工具中显示为“MyExp”,并导致将来无法使用 math.h 中的 exp。

【讨论】:

  • 目前,这是最好的解决方法,包括在声明 exp 的文件中包含此指令,让我保留我的代码,因为它可以在其他平台上运行。
  • 那么你可能会考虑使用一个可以解释正在发生的事情的名称,例如#define exp ThisIs_exp_InTheSourceCodeButRenamedByPreprocessorDefineToWorkAroundConflictWithReservedSymbol,这样任何在调试时看到它的人都可以理解它是什么。
猜你喜欢
  • 2010-11-04
  • 1970-01-01
  • 2015-08-16
  • 2010-10-26
  • 1970-01-01
  • 2013-05-26
  • 1970-01-01
  • 1970-01-01
  • 2012-07-05
相关资源
最近更新 更多