ios - 为什么在创建项目范围的常量时需要实现文件 (.m)?

标签 ios objective-c constants header-files

目前我以这种方式创建常量:

// Constants.h
FOUNDATION_EXPORT NSString *const kTestConstant;

// Constants.m
NSString *const kTestConstant = @"TestConstant";

这当然工作得很好,但是我很困惑为什么我不能像这样将所有内容都放在头文件中:

NSString *const kTestConstant = @"TestConstant";

如果我这样做,在各个类中包含 Constants.h 并在这些类中使用 kTestConstant,我会在编译时收到重新定义错误。这是为什么?

我的理论是,通过仅在头文件上使用常量,文件 Constants.h 被“复制粘贴”到导入它的类文件中,因此我最终得到了 kTestConstant 的两个副本。但是,通过使用实现文件,该文件将被编译并与导入 Constants.h 的类链接。这或多或少是正确的吗?

最佳答案

基本上,除了“粘贴”的“现代”概念之外,您的分析是正确的。编译单元是直接或间接包含/导入的所有头文件和实现文件的串联。

一如既往,我建议获得一本好的“C”语言书籍并学习它,Objective-C 只是“C”之上的薄薄一层。这就是我几年前所做的,现在还保留着这本书。

关于ios - 为什么在创建项目范围的常量时需要实现文件 (.m)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21530729/

相关文章:

ios - UIButton 边框在被选中时改变粗细

c - 为什么 int x[n] 错误,其中 n 是 const 值?

c - 一个变量声明中的多个 const

C99 const 按值传递

objective-c - 我可以在 int 和 NSNumber 之间实现多重调度吗?

ios - 调用 BOOL 方法并处理结果

xcode - 我可以在没有开发人员凭据的情况下签署 IOS 应用程序吗?

iphone - 图像裁剪给出了错误的图像部分

ios - 我需要未知元素的最高约束

ios - 在 iOS 上运行小型周期性高优先级后台任务