从C ++调用C方法

时间:2014-06-29 23:56:40

标签: c++ c

我知道有很多与此相关的问题,但我遇到的问题都没有解决我的问题。所以这里。

我有一个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;
}

我正在OSX的{​​{1}}上构建/运行它,编译器告诉我:

Xcode

对我而言,这没有任何意义。从其他SO答案来看,看起来No matching function call to 'c_method_1'我已经包装了标题extern应该告诉编译器这些函数是否存在,并在#include "C_methods.h"中编译。

有谁知道我在哪里可能会出错?我很难过。

2 个答案:

答案 0 :(得分:2)

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

#include <string>

void foo(char *);

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

该函数需要char *,但会传递const char *。如果函数没有修改指针,那么它应该是const char *。否则,您将不得不使用可修改的缓冲区。从C ++ 11开始,std::string的{​​{1}}计为一个,直到最后的内部空字符。在此之前,您最好使用&s[0]

答案 1 :(得分:0)

如果遗留函数采用非常量指针,但您知道WON&#39; T修改数据(在旧C代码中很常见),则允许使用,在这种情况下,{{1 }}。如果函数确实修改了数据,那么它是未定义的行为!

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

const_cast<char *>(s.c_str())