我在试图让 CODAN 运行一些用于 Mac 的代码时遇到了很多这样的错误。我的 Mac SDK 库通过符号链接包含在 this question 中(但不是全部 - 请继续关注!)最后,结果证明我没有包含所有标题。例如,我有以下函数调用:
IORegistryEntryGetParentEntry(service, kIOServicePlane, &parent);
哪个给出了错误:
Invalid arguments 'Candidates are: ? IORegistryEntryGetParentEntry(?,?,?)'
现在,在IOKit/IOKitLib.h(我确实有)中定义的函数的正确签名是:
kern_return_t IORegistryEntryGetParentEntry(
io_registry_entry_t entry,
const io_name_t plane,
io_registry_entry_t *parent );
现在,如果我们采用第一个参数并跟踪类型定义,我们会得到:
typedef io_object_t io_registry_entry_t; (in IOKit/IOTypes.h)
typedef mach_port_t io_object_t; (in IOKit/IOTypes.h)
typedef mach_port_name_t mach_port_t; (in mach/port.h)
typedef natural_t mach_port_name_t; (in mach/port.h)
然后!我没有定义__darwin_natural_t 的包含。这个包含实际上在i386 中,而我的符号链接目录中没有它。添加它完成了链:
typedef __darwin_natural_t natural_t; (in i386/vm_types.h)
typedef unsigned int __darwin_natural_t; (in i386/_types.h)
最后,CODAN 知道IORegistryEntryGetParentEntry() 的参数 1 应该是什么类型,错误变为:
Invalid arguments 'Candidates are: kern_return_t IORegistryEntryGetParentEntry(io_registry_entry_t ,?,io_registry_entry_t*)'
我对其他参数重复了这个“类型跟踪”,发现错误消失了(我什至不需要重建索引,但是 YMMV)。当然,您需要找到您需要的标头,并且可以确定 它们 已包含在内 - 以上只是一个示例!