【问题标题】:How to declare #pragma pack (1) in swift如何在 swift 中声明#pragma pack (1)
【发布时间】:2015-03-24 18:33:58
【问题描述】:

我正在尝试将 iOS 应用程序从目标 c 重写为 swift。 我正在使用序列化来通过某种通信层发送数据。 在objective c中,我在每个结构的顶部使用了#pragma pack (1),以便使用顺序布局而不在数据成员之间进行填充。 我尝试在结构顶部使用 PRAGMA_STRUCT_PACK 。 它似乎在操场上工作,但在我的应用程序中实现它时,我收到一条错误消息:“表达式不允许在顶层”。

【问题讨论】:

  • 在 Swift 中没有编译指示,没有宏。
  • 已在 Xcode 6 beta 4 中修复。现在您可以实现

标签: ios objective-c iphone xcode swift


【解决方案1】:

Swift 不支持显式指定结构类型的数据布局。 (至少,目前不是。File a bug 如果有你想看到的功能,也许苹果会把它们放在未来的版本中?)现在你最好的选择可能是声明布局敏感的结构(以及要访问的功能它们)在 C 中并从 Swift 中调用它们。

在 Swift 源代码中编写 PRAGMA_STRUCT_PACK 会给您一个错误,因为该宏一旦从 C 中导入,就会计算为文字 1。在 C 语言中,您应该使用该宏来检测编译器是否支持 #pragma pack(在继续发出 #pragma pack 指令之前)。

(您可能会看到令人困惑的答案/cmets,因为在早期的 Swift 测试版中 lots of people were looking for #pragma mark。但这不是他们正在谈论的 #pragma。)

【讨论】:

  • PRAGMA_STRUCT_PACK 实际上在 Swift 中工作得非常好(因为 Swift 从 C 头文件中导入它)。问题不在于 Swift 没有预处理器,而在于 PRAGMA_STRUCT_PACK 实际上只是根据 C 编译器是否支持 #pragma pack 来定义为值 01(在这种情况下,它的计算结果为 1 )。
【解决方案2】:

Swift 不是 C。如果您关心内存中结构的布局,那您就来错地方了。我的意思是你到底为什么会对那种实现细节感兴趣? Swift 会按照它想要的方式来布局,没有其他方式。它不是汇编语言。

顺便说一句。尝试使用打包结构进行序列化是完全错误的。创建一个字节数组并将您想要写入的内容写入其中。

【讨论】:

  • “我的意思是你到底为什么会对那种实现细节感兴趣?” - 因为有时你会得到一块内存,它实际上包含一个 pakced 结构的数据,例如当您在原始网络套接字上接收 IP 数据包或解析具有固定大小标头的二进制文件类型时。如果没有控制打包的用例,您为什么认为编译器/语言甚至提供该功能?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-19
  • 2013-09-29
  • 2017-01-14
  • 2014-07-27
  • 2016-01-15
  • 1970-01-01
  • 2014-05-10
相关资源
最近更新 更多