在Objective-C的头文件中,#define是什么意思?

4
我有一个名为Global.h的文件,如下所示:
#define NUMBERX 21
在AppDelegate.h中,我包含了Global.h文件。在AppDelegate.m中,我包含了AppDelegate.h文件。但是在AppDelegate.m中,我无法访问NUMBERX变量。
ERROR: Use of undeclared indentifier 'NUMBERX'.
如果我在AppDelegate.h中定义NUMBERX,则可以正常工作,但我希望只在所有其他需要使用NUMBERX变量的头文件中包含头文件(Global.h)。
如何解决这个问题?

它在AppDelegate.h中工作吗? - Luke
是的。但这不是我想要的。我只想为整个项目定义一次变量。 - TheFox
不,我的意思是你能在AppDelegate.h中访问NUMBERX吗?还是那里也会出现错误? - Luke
如果把它放在pch文件中,它能正常工作吗? - Abizern
你犯了一些基本错误。可能是某个地方拼写错误,#define 实际上在注释中,头文件名称冲突等等。 - Hot Licks
这个问题在2016年仍然可能出现吗? - Ky -
4个回答

1

假设在使用之前没有对其进行#undef,那么这应该是可以的。您是否在AppDelegate.m文件中包含AppDelegate.h之前使用了该符号?您是否使用了可能禁止其包含的包含保护?


你说的include guards是什么意思?不,我没有使用#undef。是的,我在每个文件的顶部包含了所有的头文件。这意味着在我包含AppDelegate.h文件之前,我不会使用该符号。 - TheFox
包含保护是头文件中的 #ifndef _SOMESYMBOL ... #endif 这样的东西,用于防止重复包含导致错误。如果您两次重复使用相同的保护符号,则可能会导致此问题。如果您没有这样做,我们需要更多信息(即仍然无法工作的文件的最小版本)。 - Adam Wright

1

如果您正在使用Objective-C标准的#import来包含您的头文件,请尝试将其替换为"c"的#include


是的,谢谢。这个很好用。也许使用Objective-C标准的#import来处理带有关联.m文件的文件。我的Global.h没有一个Global.m兄弟文件。 - TheFox
@TheFox - 不是这样的 - Objective-C 协议只是没有相应实现文件的头文件,它们可以正常工作。 - Abizern
@Abizern - 啊,好的,但问题肯定是#import而不是#include。感谢大家的回答。 - TheFox
这在2016年仍然适用吗? - Ky -

0

你需要在AppDelegate.m文件中包含你的Global.h文件。


那也不行。只有在AppDelegate.h中定义变量才有效。 - TheFox

0

你能不能使用 int const NUMBERX,这样你就可以得到代码补全和编译器检查。

苹果公司在这里有一些非常好的指南,关于定义常量和命名它们 Apple 编码指南 - 常量


当然,有多种实现方式。我的深层意识是用宏定义的l()函数替换所有的NSLOG()。在生产环境中,我没有定义DEBUG变量,因此所有日志输出都不会显示。 - TheFox
仅仅因为你可以获得代码补全和编译器检查,我认为苹果文档中建议的方法比 #define 更优秀。此外,如果你需要在整个项目中使用该常量,你可以考虑将 Global.h 添加到你的 pch 文件中。定义宏 l() 肯定会为你节省一些击键,但它也会给你的项目增加负担,你需要告诉任何与你合作的人这就是你正在做的事情。这就是为什么人们坚持标准以使协作更容易。 - Paul.s

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接