我有一个文件( FILE_A.cpp),其中包含一个函数体,如下所示:
vector<char *> lines_vector;
foo(my_file_path, "zzz", lines_vector, fout);
Run Code Online (Sandbox Code Playgroud)
foo 在另一个文件中定义( FILE_B.cpp)中:
void foo(char * in_file, char * keyword, vector<char *>& lines_vector, FILE * fout)
Run Code Online (Sandbox Code Playgroud)
自从 FILE_A.cpp使用FILE_B.cpp的功能,它包括它的头,这里是问题:
FILE_B.h 的所有函数头都在一个
#ifdef __cplusplus
extern "C" {
#endif
...
void foo(char * in_file, char * keyword, vector<char *>& lines_vector, FILE * fout)
...
#ifdef __cplusplus
};
#endif
Run Code Online (Sandbox Code Playgroud)
当尝试添加我的函数时,它无法识别向量。给出的错误是
1) 在 '<' 标记之前应有 ',' 或 '...'
2) '}' 标记之前的预期初始值设定项
3) 'vector' 尚未声明
这让我怀疑extern C无法解析这个。在内部使用 cpp 对象extern "C" {}有问题还是这里有其他问题?
里面的声明extern "C"需要是普通的C,而不是 C++。IANALL,不能说 C++ 标准的“法律”是什么,但是,一些编译器会报告一个错误(他们应该),一些警告,一些只会“继续”,但是,几乎不可能做到这项工作,因为std::vector<>是一个模板。
问题是:你不能在 C 接口中使用 C++ 对象。那么如何从C端创建这样一个对象呢?
所以你必须将你的呼叫更改为:
void foo(char * in_file, char * keyword, char **lines_vector, int, lines_vector_size, FILE * fout)
Run Code Online (Sandbox Code Playgroud)
然后,由于您无法将向量映射到缓冲区(How to Cheaply allocate C-style array to std::vector?),所以要使用 a,vector您需要创建一个vector<char *>工作对象并复制数据(只有指针应该是好的),在您的算法中使用它,然后将矢量数据复制回lines_vector(或者如果指针没有改变,则什么都不做)
未经测试,我会天真地做如下
void foo(char * in_file, char * keyword, char **lines_array, int, lines_array_size, FILE * fout)
{
std::vector<char *> lines_vector;
for (int i=0;i<lines_array_size;i++)
{
lines_vector.push_back(lines_array[i]);
}
}
Run Code Online (Sandbox Code Playgroud)
如果指针本身已更新,则必须释放旧指针并将新指针复制到 C 结构中。我不确定上下文是什么,但这方面很敏感(谁负责每个字符串的分配内存......)