我有一个文件( FILE_A.cpp ),其函数主体如下:
vector<char *> lines_vector;
foo(my_file_path, "zzz", lines_vector, fout);
foo
在另一个文件( FILE_B.cpp )中定义:
void foo(char * in_file, char * keyword, vector<char *>& lines_vector, FILE * fout)
由于 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
,当尝试添加我的函数时,它无法识别向量。给出的错误是
1)预期在“ <”令牌之前的“,”或“ ...”
2)'}'令牌之前的预期初始化程序
3)“ vector”尚未声明
这使我怀疑extern C
无法解析此内容。在extern "C" {}
内使用cpp对象是否存在问题,还是这里还有其他问题?
答案 0 :(得分:4)
extern "C"
中的声明必须为纯 C,而不是C ++。 IANALL,无法说出C ++标准的“法律”是什么,但是,有些编译器将报告错误(并且他们应该应该),一些警告和一些“继续进行”,但是,由于std::vector<>
是模板,因此几乎无法完成这项工作。
答案 1 :(得分:3)
问题是:您不能在C接口中使用C ++对象。那么如何从C端创建这样的对象?
因此您必须将呼叫更改为:
void foo(char * in_file, char * keyword, char **lines_vector, int, lines_vector_size, FILE * fout)
然后,因为您无法将向量映射到缓冲区(How to cheaply assign C-style array to std::vector?),所以要使用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]);
}
}
如果指针本身已经更新,则必须释放旧指针并将新指针复制到C结构。我不确定上下文是什么,但是这个方面很敏感(谁负责每个字符串的分配内存...)
答案 2 :(得分:2)
C不了解模板。
std::vector<>
是一个类模板。
因此,在请求与extern "C"
的类C链接时,无法使用类模板,因为在不使用名称修饰的情况下,它无法将链接器中的std::vector<int>
与std::vector<char>
区分出来。 / p>