【问题标题】:c and c++ mixedc和c++混合
【发布时间】:2012-08-22 11:52:50
【问题描述】:

我需要从 c 文件中调用 cpp 方法。 我为此写了这个界面..

cpp 文件

extern "C" void C_Test(int p){
      Class::CPP_Test(p);
}

c 文件

extern void C_Test(int p);


void C_Function(){
   C_Test(10); //error
}

我在 c 文件中遇到错误“未定义对 C_Test(int) 的引用”

知道有什么问题吗?

【问题讨论】:

  • 您需要显示有关如何编译和链接的信息。
  • 你没有链接所有东西。
  • 我对这两种类型的文件都使用了 C++ 编译器。没有“C”它可以工作!也没有 extern "c" 它可以工作!
  • @Meloun,因为您的处理方式相同。您的 extern "C" 需要位于声明函数的 .hpp 和 .cpp 文件中。

标签: c++ c interface mixing


【解决方案1】:

您必须只为函数原型声明 extern,并确保正确链接。除此之外,CPP_Test(p) 必须是 Class 的静态成员,否则您的代码将不起作用。最后,extern "C" 必须用括号括起来它的内容,更像

extern "C"
{
  void C_Test(int p)
  {
    Class::CPP_Test(p);
  }
}

告诉我们这是否可行。

【讨论】:

    【解决方案2】:

    您是否都使用 C++ 编译器进行编译? C++ 编译器可能会将 C 源文件编译为 C++,在这种情况下它会执行名称修饰,因此您需要确保使用 C 编译器编译 C 源文件。

    【讨论】:

    • 我已经看到他们弄乱并添加前缀(我认为 Visual Studio 可能来自内存,或者可能是 Borland),所以即使你 extern "C" 你的函数也可能是 _C_Test(int)。看看你的设置。还要检查您的地图文件以查看正在导出的符号。
    【解决方案3】:

    我对这两种类型的文件都使用了 C++ 编译器。 没有“C”它可以工作!也没有 extern "c" 它可以工作!

    【讨论】:

    • 这只是令人困惑。您在问题中说您需要从 C 文件中调用 C++ 函数,即您正在使用 C 和 C++ 编译器。现在你说你只使用 C++ 编译器。这是什么意思?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多