我知道有很多与此相关的问题,但我遇到的问题都没有解决我的问题。所以这里。
我有一个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"
中编译。
有谁知道我在哪里可能会出错?我很难过。
答案 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())