从Objective C调用C语言函数

3

我对Objective-C和C都不熟悉。我正在尝试在Objective-C程序中使用这个随机生成器C库。我的理解是,Objective-C是C的严格超集,因此应该是可能的。

我的代码编译并运行,但我收到了很多警告。

  • 警告:隐式声明函数'mt_seed32'
  • 警告:隐式声明函数'mt_lrand'
  • 语义问题:C99中隐式声明函数'mt_seed32'无效
  • 语义问题:C99中隐式声明函数'mt_lrand'无效
  • 语义问题:不兼容的整数到指针转换初始化'uint32_t *'(也称为'unsigned int *'),表达式类型为'int'

我没有将C头文件导入到Objective-C类中,它只是找到它。如果我导入它,我会得到重复的方法错误。

C库头文件:

extern void     mt_seed32(uint32_t seed);

extern uint32_t     mt_lrand(void); 

调用它的代码:[我曾尝试使用[self method()]进行调用,但会导致崩溃]

mt_seed32(3);

uint32_t *i = mt_lrand();

有人能告诉我如何消除这些警告吗?


3
您看到警告是因为您没有包含声明那些函数的C头文件。如果您包含头文件,能否将出现的错误消息发布出来? - user557219
如果我在文件顶部添加#include "RandomGenerator.h",我会得到以下错误:ld: 重复符号_mts_lrand - andy boot
3个回答

8
最后一个编译错误发生是因为mt_lrand();返回的是int类型,而不是指向int类型的指针。因此,最后一行应该是:
uint32_t i = mt_lrand();

所有其他错误都是因为您没有包含库头文件。请问当您包含库头文件时发生了哪些错误?


2

当你在定义函数之前使用函数时,通常会出现诸如implicit declaration of function 'mt_seed32'的消息。请参见以下示例。

void foo() {
    //do stuff
    bar(); //call bar that was declared later
}

void bar() {
    ...
}

如果您忘记包含头文件,或者在使用头文件中声明的函数之后才包含它,则可能会发生这种情况。另一种解决方法是在使用前声明函数原型。

此外,您将随机数分配给一个指向uint32_t的指针。这是您真正想要的吗? 如果不是,则必须从声明中删除*uint32_t i = mt_lrand();


0

通过将文件类型从“.m”更改为“.mm”,我成功解决了问题。这会导致编译器使用obj c++而不是obj c。它消除了警告,但我不确定是否已经解决了潜在的问题。

解决方案-重复符号


这解决了问题,因为C++对内联函数的处理方式不同。从一个非常简要的扫描来看,根本原因似乎是这个库中各种兼容性宏(用于内联/外部关键字和实际函数定义的位置MT_INLINE/MT_EXTERN/MT_GENERATE_CODE_IN_HEADER)的设置方式。 - puzzle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接