在外部元素“ C”中声明向量使用函数{}

时间:2018-07-16 11:21:59

标签: c++

我有一个文件( 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对象是否存在问题,还是这里还有其他问题?

3 个答案:

答案 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>