在 header (.h) 文件中放置 #define 语句有什么好处?

What are the benefits of placing a #define statement in a header (.h) file?

与实现文件 (.m) 相比,将 #define 预处理器语句放在 header 文件 (.h) 中有什么好处吗?

我有遗留代码,其中散布着 #define 语句。这些语句是否受范围影响?

不太可能产生任何明显的差异,但如果 #define 仅在一个 class 中需要,则将其放入 .m 文件中(如果需要导入 class)要了解它,请将其放入 .h 文件中。

假设您有两个 classes FooBarBar.m 导入 Foo.hFoo.h 中的任何 #define 都将在处理 Bar 时由预处理器读取。 Bar 中未使用的任何 #define 对预处理器读取毫无意义。 Foo.m 中的任何 #define 只会在预处理器处理 Foo 时被读取,因为没有任何内容导入该文件。

.h 文件中包含 #define 没有任何好处,显然,除了使它们在多个 .m 文件中可用之外。

因此,如果它可能(即使您还没有这样做)可能对多个 .m 文件有用,则将其放入 .h 文件中。如果它只对单个 .m 文件有价值,则将其放入 .m 文件中。

以上推论:避免在多个 .m 文件中重复 #define:如果在多个 .m 文件中有相同的 #define,那么这是应该在 .h 文件中的候选对象。

在评论中你考虑是否有"negative impact to grouping [them] together"。如果您打算将它们移动到 .h 文件,我不赞成这样做。将范围缩小到 possible/logical。如果您正在考虑将它们移动到 .m 文件,问题是这些常量中的任何一个是否对更广泛的上下文可能有用。

最重要的是,我不建议仅仅为了将它们放在一起而将它们合并到一个区域。让常量的功能意图决定它的去向。