【问题标题】:Calling a C method from C++从 C++ 调用 C 方法
【发布时间】:2014-06-29 23:56:39
【问题描述】:

我知道有很多与此相关的 SO 问题,但我遇到的问题都没有解决我的问题。就这样吧。

我有一个C++ 文件和方法:

MyClass.cpp

extern "C" {
#include "C_methods.h"
}

void MyClass::run_c_method_1()
{
    std::string filename_1 = <from somewhere else>;
    std::string filename_2 = <from somewhere else>;
    c_method_1(filename_1.c_str(), filename_2.c_str());
}

C_methods.h

#ifndef Project_C_methods_h
#define Project_C_methods_h

int c_method_1(char* filename1, char* filename_2);

#endif

C_methods.c

#include "C_methods.h"

int c_method_1(char* filename1, char* filename_2) {
  /* Do some stuff */
  return 0;
}

我正在 OSXXcode 上构建/运行它,编译器告诉我:

No matching function call to 'c_method_1'.

对我来说,这毫无意义。从其他 SO 答案来看,我将标头 #include "C_methods.h" 包裹在其中的 extern 似乎应该告诉编译器这些函数存在,并在 C 中编译。

有谁知道我在哪里可能会出错?我被难住了。

【问题讨论】:

  • 尝试删除extern "C"并使用__BEGIN_DECLS/__END_DECLS
  • char * 不是const char *。如果发布了完整的错误,会更容易注意到。
  • @chris,我认为你在做某事。我认为这是导致问题的 const 。现在检查。
  • @chris,是的,把这个放在答案中,我会接受。谢谢!

标签: c++ c


【解决方案1】:

您的问题实际上可以简化为:

#include <string>

void foo(char *);

int main() {
    std::string s;
    foo(s.c_str());
}

该函数接受char *,但将const char * 传递给它。如果该函数不修改指针对象,则应采用const char *。否则,您将不得不使用可修改的缓冲区。从 C++11 开始,std::string&amp;s[0] 计数为 1,直到最后的内部空字符之前。在此之前,您最好使用std::vector&lt;char&gt;

【讨论】:

    【解决方案2】:

    如果旧函数采用非常量指针,但您知道它不会修改数据(在旧 C 代码中很常见),则允许使用 const_cast&lt;char *&gt;(s.c_str())。如果函数确实修改了数据,那是未定义的行为!

    如果函数可能会修改数据,那么您需要将字符串复制到可修改的缓冲区中并传递一个指向该缓冲区的指针。

    string s;
    vector<char> buffer(s.size() + 1); // prepare buffer, with space for null char
    strcpy(buffer.data(), s.c_str()); // copy string data
    foo(buffer.data());
    s = buffer.data(); // copy back string data if required
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-26
      • 2016-03-26
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 2015-06-29
      • 2012-02-09
      • 1970-01-01
      相关资源
      最近更新 更多