定义常量:

1.使用extern

.h中可以声明,导入头文件直接使用,也可以不声明,直接在使用这个常量的文件里直接声明
extern NSString * const kMyConstantString;
--------------------------
.m实现
NSString * const kMyConstantString = @"hello";

2.使用FOUNDATION_EXPORT

.h中可以声明,导入头文件直接使用,也可以不声明,直接在使用这个常量的文件里直接声明
FOUNDATION_EXPORT NSString * const kMyConstantString;
--------------------------
.m实现
NSString * const kMyConstantString = @"Hello";

3.使用#define

#define kMyConstantStr @"hello"

区别

demo

extern不应该用在定义常量

extern修饰的全局变量默认是有外部链接的,作用域是整个工程,在一个文件内定义的全局变量,在另一个文件中,通过extern全局变量的声明,就可以使用全局变量

extern使用,不需要导入头文件,只需要引用

#import "ViewController.h"
// 这里只是声明,定义(分配内存)是在自定义(Common.m)的类里面进行的
extern NSString * const kMyConstantString;

@interface ViewController ()

@end
- (void)viewDidLoad {
    [super viewDidLoad];
    NSString *myStr = @"hello";
    // 值比较
    if ([myStr isEqual: kMyConstantStr]) {
       ...
    }
    // 指针是否相等
    if (myStr == kMyConstantString) {
       ...
    }
}

Xcode的编译器是能够识别C++语言编程代码的

#if defined(__cplusplus)
#define FOUNDATION_EXTERN extern "C"
#else
#define FOUNDATION_EXTERN extern
#endif

由以上定义可以看出 FOUNDATION_EXTERN 是可以兼容C++的extern的宏。同样也可以推测出 extern “C” 也就是用来兼容C++里面的extetrn 的

stackoverflow里- “FOUNDATION_EXPORT” vs “extern”

总结,使用Objective-C开发,使用extern或者FOUNDATION_EXPORT是没有区别的.