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

时间:2014-02-03 15:08:01

标签: 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的类链接。这或多或少是正确的吗?

1 个答案:

答案 0 :(得分:3)

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

我一如既往地推荐获得一本好的“C”语言书并对其进行研究,Objective-C只是“C”之上的一层薄层。这就是我多年前所做的,仍然有这本书。