从Objective C调用C

我是客观c&c的新手。 我试图在一个客观的c程序中使用这个随机生成器c库 。 我的理解是,客观c是c的严格超集,所以这应该是可能的。

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

  • 警告:隐式声明函数’mt_seed32′
  • 警告:函数’mt_lrand’的隐式声明
  • 警告:语义问题:函数’mt_seed32’的隐式声明在C99中无效
  • 警告:语义问题:函数’mt_lrand’的隐式声明在C99中无效
  • 警告:语义问题:不兼容的整数到指针转换使用unsigned int *类型的表达式初始化uint32_t * (aka unsigned int *

我没有将C头文件导入到目标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(); 

任何人都可以告诉我如何摆脱这些警告?

由于mt_lrand(); 返回一个int,而不是指向int的指针。 因此,最后一行应该是

 uint32_t i = mt_lrand(); 

所有其他错误都是由于您没有#include库头。 您能否发布包含库标题时发生的错误?

当您在定义函数之前使用函数时,通常会弹出诸如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();

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

解决方案 – 重复符号