【问题标题】:Accessing C macros in Swift在 Swift 中访问 C 宏
【发布时间】:2017-04-27 17:02:31
【问题描述】:

我有一个第三方 C 库导出大量带有参数的预处理器宏

问题是当我尝试在 Swift 中访问它们时失败:

无法解析符号。

在 Swift 中访问这些由第三方库导出的 C 宏的方法是什么?

我不想通过直接调用名称以__ 开头的函数来解决问题,并使我的代码看起来很难看,也不想编辑/破解第三方库。

【问题讨论】:

  • 这个文档没有回答这个问题,我很惊讶没有直接的方法来访问 C 头文件中的宏?
  • 也就是说,唯一的办法就是修改C头文件或者直接调用__函数名!很糟糕。
  • 你能给我们举个例子吗?
  • 例子很多,#define myinit(A,B) __myinit(A,B,sizeof(B))等

标签: ios objective-c c swift c-preprocessor


【解决方案1】:

没有简单的答案。前面提到的Apple documentation 非常清楚地说明了这一点:

复杂的宏在 C 和 Objective-C 中使用,但在 Swift 中没有对应的。

但是,如果你真的需要调用那些(丑陋的!)C 宏,你可以在它们周围定义 C99 inline 函数(并从你的 Swift 代码中调用它们)。

例如,给定这个 C 宏:

#define SQUARE(n) n * n

在另一个头文件中定义这个 C 函数:

inline double square(double n) {
    return SQUARE(n);
}

与我所知道的确切不同——请注意,我必须提交double 数字类型;那些疯狂的文本/符号操作也不起作用;等等——但可能会让你走到一半:)


纯 Swift 替代方案。当然,您也可以手动将所有这些 C 宏转换为惯用的 Swift 函数,使用 protocolsgenerics 等来模拟一些C 宏魔法。

如果我走这条路——成为我这个偏执的工程师! — 我会将原始转换后的标头的 MD5 与当前文件版本进行比较,如果两个哈希不匹配,则 Xcode 构建失败。

这可以通过 pre-action build script 轻松完成,例如:

test EXPECTED_HASH != $(md5 HEADER_PATH) && exit 1

如果此构建步骤失败,那么是时候检查您(手动)转换后的 Swift 代码并在之后更新EXPECTED_HASH :)

【讨论】:

  • 我最终不得不制作一个新的 swift 文件并将所有宏转换为 swift 函数。想象一下像 FFMpeg 或 OpenCV 这样的大型库,它们有这么多用于函数的 C 宏,如何翻译它们!
  • @DeepakSharma 看起来对我来说是一份非常有趣的工作,哈哈 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-04
  • 2018-01-09
相关资源
最近更新 更多