【问题标题】:Calling C from Objective C从目标 C 调用 C
【发布时间】:2011-09-02 03:33:25
【问题描述】:

我是目标 c & c 的新手。我正在尝试在目标 c 程序中使用这个random generator c library。我的理解是目标 c 是 c 的严格超集,所以这应该是可能的。

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

  • 警告:函数“mt_seed32”的隐式声明
  • 警告:函数“mt_lrand”的隐式声明
  • 警告:语义问题:函数“mt_seed32”的隐式声明在 C99 中无效
  • 警告:语义问题:函数“mt_lrand”的隐式声明在 C99 中无效
  • 警告:语义问题:使用int 类型的表达式初始化uint32_t *(又名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();

谁能告诉我如何摆脱这些警告?

【问题讨论】:

  • 您会收到警告,因为您没有包含声明这些函数的 C 头文件。能否贴出包含头文件时收到的错误消息?
  • 如果我将#include "RandomGenerator.h" 添加到文件顶部,我会收到此错误:ld: duplicate symbol _mts_lrand

标签: objective-c c


【解决方案1】:

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

uint32_t i = mt_lrand();

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

【讨论】:

    【解决方案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();

    【讨论】:

      【解决方案3】:

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

      Solution – Duplicate Symbol

      【讨论】:

      • 这解决了问题,因为 C++ 对内联函数的处理方式不同。简而言之,根本原因似乎是如何在这个库中设置内联/外部关键字的各种兼容性宏以及实际函数定义 (MT_INLINE/MT_EXTERN/MT_GENERATE_CODE_IN_HEADER) 的位置。
      猜你喜欢
      • 2013-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-01
      • 1970-01-01
      相关资源
      最近更新 更多