我正在尝试解决如果我忘记在我的目标中包含类别实现,Xcode 可以告诉我吗?,我想出了以下解决方案:
NSObject+Foo.h
extern int volatile canary;
void canaryCage() {
canary = 0;
}
NSObject+Foo.m
int canary = 0;
现在,如果我在一个源文件中,如果我的目标中没有包含#import "NSObject+Foo.h"
链接器错误,我会得到一个链接器错误。NSObject+Foo.m
但是,每次#import "NSObject+Foo.h"
我生成一个重复的_canaryCage
符号。我不能使用__COUNTER__
,因为我只#import "NSObject+Foo.h"
在实现文件中。我需要canaryCage
在我的整个符号表中是唯一的。
我需要类似的东西:
#define CONCAT(x, y) x##y
#define CONCAT2(x, y) CONCAT(x, y)
extern int volatile canary;
void CONCAT2(canaryCage, __RANDOM__)() {
canary = 0;
}
这样,如果我有如下源文件:
巴.m
#import "NSObject+Foo.h"
巴兹
#import "NSObject+Foo.h"
我会得到类似_canaryCage9572098740753234521
and的符号_canaryCage549569815492345
,这不会冲突。我也不想启用--allow-multiple-definition
in,ld
因为我希望其他重复的符号定义会导致错误。canaryCage
除了我忘记链接我#import
编辑的头文件的源文件的标记之外,我不想使用任何东西。