【发布时间】:2018-04-16 01:13:45
【问题描述】:
我在 Xcode/Objective-C 中遇到了一些意想不到的行为。我知道可能不建议这样做,但如果我想在 .m 文件中创建自己的struct in_addr,似乎我做不到。这意味着 Objective-C 中的命名空间和符号污染有些奇怪。这似乎适用于许多其他网络类型,也许也适用于其他 POSIX-y 事物。
我想出了一个非常基本的示例来演示这种行为。注意这个sn-p就是.m文件的全部内容。
#define _SYS_SOCKET_H_
#define _NETINET_IN_H_
#include <stdint.h>
struct in_addr {
uint32_t foo;
};
这会产生构建错误Redefinition of 'in_addr'。
这暗示了关于 Objective-C 的一些相当奇怪的事情。首先,我不希望<stdint.h> 引入任何网络类型。但即使允许它可能,首先定义_NETINET_IN_H_ 应该会阻止struct in_addr 的定义。然而即使如此,这段代码仍然拒绝构建。
是否有可能以某种方式放弃这种强制符号可见性?无论如何,是否有包含符号的列表?这种行为有充分的理由吗?
编辑:更奇怪的是,如果我删除 <stdint.h> 并将 uint32_t 更改为 int,这实际上会编译。
【问题讨论】:
标签: objective-c