gpt4 book ai didi

objective-c - 在 C 预处理器中生成随机标识符以避免重复的链接器符号

转载 作者:太空宇宙 更新时间:2023-11-04 02:56:12 25 4
gpt4 key购买 nike

我正在尝试解决 Can Xcode tell me if I forget to include a category implementation in my target? ,我想出了以下解决方案:

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;
}

这样,如果我有如下源文件:

Bar.m

#import "NSObject+Foo.h"

Baz.m

#import "NSObject+Foo.h"

我会得到像 _canaryCage9572098740753234521_canaryCage549569815492345 这样的符号,它们不会冲突。我也不想在 ld 中启用 --allow-multiple-definition 因为我希望其他重复的符号定义导致错误。我不想将 canaryCage 用于任何东西,只是一个标记,我忘记链接一个源文件,其标题是我 #imported 的。

最佳答案

如果你让它成为static,每个翻译单元都会得到自己的副本,其他一切都应该按照你想要的方式工作——不需要预处理器体操。

static void canaryCage()
{
canary = 0;
}

关于objective-c - 在 C 预处理器中生成随机标识符以避免重复的链接器符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17079290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com