#pragma标记的意义​​是什么?为什么我们需要#pragma标记?


279

#pragmaXcode 中标记的目的是什么?它们在.m文件中的位置重要吗?应该#pragma在所有其他人之前出现吗?

  • 他们必须在场吗?
  • 可以添加新标记吗?为什么会这样?是什么原因造成的?
  • 删除商标有什么危害吗?有人会想要吗?


我个人不喜欢他们。认真地说,您想一直考虑要在哪里放置方法?有更多重要的事情要保持组织,例如注意单一责任原则
布拉德·托马斯

2
对于快速语言#Pragma标记无效。使用#MARK或#FIXME或#TODO查看此链接以了解更多信息stackoverflow.com/a/33040068/1753005
Jayprakash Dubey

Answers:


315

#pragma mark指令显示在菜单的Xcode中,可直接访问方法。它们对程序完全没有影响。

例如,将其与Xcode 4配合使用将使这些项目直接显示在跳转栏中。

有一条特殊pragma mark -的线可以创建一条线。

在此处输入图片说明


欣赏答案-您是否能够发布更新的答案,以显示新XCode中的杂用标记外观(在该菜单中或现在位于任何位置)?
user7804781

是否有Python等效项?
爱德华·福尔克

@EdwardFalk这是特定于IDE的,因此它实际上取决于您的IDE /文本编辑器
Michael Ozeryansky '19

我的GCC编译器发出了警告foo.h:52:0:警告:忽略#pragma标记[-Wunknown-pragmas] #pragma标记-这不是致命的。因此,gcc可能不知道'-'。
周克敏

55

#pragma mark用于标记方法组,以便您可以轻松地从跳转栏中查找和检测方法。当您的代码文件达到大约1000行并且您想通过“跳转”框中的类别快速找到方法时,它可能会对您有所帮助。

在较长的程序中,很难记住和查找方法名称。因此,pragma mark允许您根据方法所做的工作对其进行分类。例如,您为表视图协议方法,AlertView方法,初始化方法,声明等标记了一些标签。

#pragma mark是XCode的工具,但对您的代码没有影响。它仅有助于简化编码时的查找方法。


21

简单来说,我们可以说它 #pragma mark -是用于方法分类的,因此您可以轻松地找到您的方法。这对于长时间的项目非常有用。


13

只是添加我正在寻找的信息:pragma mark是特定于Xcode的,因此,如果您处理在不同的IDE中打开的C ++项目,则该项目在这里没有任何作用。例如,在Qt Creator中,它不会为方法添加类别,也不会生成任何警告/错误。

编辑

#pragma是来自C编程语言的预处理程序指令。其目的是向编译器指定与实现有关的信息-也就是说,每个编译器都可以选择根据需要解释该指令。也就是说,它被认为是不会更改/影响代码本身的扩展。因此,编译器可能会忽略它。

Xcode是一个IDE,可以利用#pragma它并以其特定方式使用它。关键是,#pragma它不是Xcode甚至不是Objective-C。


11

当我们有一个大/冗长的类时,说几百行以上的代码,我们在Monitor屏幕上看不到所有内容,因此我们看不到类的概述(也称为文档项)。有时候我们想看看我们班级的概况。所有方法,常量,属性等一目了然。您可以在XCode中按Ctrl + 6来查看课程概述。您将获得一种弹出式窗口,又称跳转栏。

默认情况下,此跳转栏没有任何存储区/分区。这只是一长串。(尽管我们可以在出现跳转栏时开始输入内容,并且会在跳转栏项中进行搜索)。这里需要pragma mark

如果要在跳转栏中创建节,则可以使用带有相关描述的编译指示。现在,参考有问题的快照。其中有“查看生命周期”和“专用于..的部分”是由pragma marks 创建的部分



7
#pragma mark - NSSecureCoding

“编译指示”的主要目的是供开发人员参考。在此处输入图片说明

您可以在成千上万的编码行中轻松找到方法/函数。

Xcode 11+:

标记线在顶部

// MARK: - Properties

顶部和底部的标记线

// MARK: - Properties - 

标记线仅在底部

// MARK: Properties -

所以我可以删除线?它浪费了我的大脑。

1
删除#pragma-mark不会影响您的代码的任何功能,但是您的代码可能会失去可读性。如果您确实不想要,可以将其删除。
Jeba Moses
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.