C++ 使用extern时出错";";在c+中包含标题+;程序
我正在做一个学校的项目,需要合作。Sheepdog提供了一个c api,使您能够连接到Sheepdog服务器。 首先,我创建具有以下内容的c源文件(test.c):C++ 使用extern时出错";";在c+中包含标题+;程序,c++,c,extern,C++,C,Extern,我正在做一个学校的项目,需要合作。Sheepdog提供了一个c api,使您能够连接到Sheepdog服务器。 首先,我创建具有以下内容的c源文件(test.c): #include "sheepdog/sheepdog.h" #include <stdio.h> int main() { struct sd_cluster *c = sd_connect("192.168.1.104:7000"); if (!c) { fprintf(stderr, "failed to
#include "sheepdog/sheepdog.h"
#include <stdio.h>
int main()
{
struct sd_cluster *c = sd_connect("192.168.1.104:7000");
if (!c) {
fprintf(stderr, "failed to connect %m\n");
return -1;
}else{
fprintf(stderr, "connected successfully %m\n");
}
return 0;
}
extern "C"{
#include "sheepdog/sheepdog.h"
}
#include <stdio.h>
int main()
{
struct sd_cluster *c = sd_connect("192.168.1.104:7000");
if (!c) {
fprintf(stderr, "failed to connect %m\n");
return -1;
}else{
fprintf(stderr, "connected successfully %m\n");
}
return 0;
}
#包括“sheepdog/sheepdog.h”
#包括
int main()
{
struct sd_cluster*c=sd_connect(“192.168.1.104:7000”);
如果(!c){
fprintf(stderr,“无法连接%m\n”);
返回-1;
}否则{
fprintf(stderr,“已成功连接%m\n”);
}
返回0;
}
然后使用以下命令编译,没有错误
gcc-o测试test.c-lsheeplog-lpthread
<>但是我需要用C++项目来使用它,所以我创建了一个CPP文件(test .CPP),内容如下:
#include "sheepdog/sheepdog.h"
#include <stdio.h>
int main()
{
struct sd_cluster *c = sd_connect("192.168.1.104:7000");
if (!c) {
fprintf(stderr, "failed to connect %m\n");
return -1;
}else{
fprintf(stderr, "connected successfully %m\n");
}
return 0;
}
extern "C"{
#include "sheepdog/sheepdog.h"
}
#include <stdio.h>
int main()
{
struct sd_cluster *c = sd_connect("192.168.1.104:7000");
if (!c) {
fprintf(stderr, "failed to connect %m\n");
return -1;
}else{
fprintf(stderr, "connected successfully %m\n");
}
return 0;
}
extern“C”{
#包括“牧羊犬/牧羊犬.h”
}
#包括
int main()
{
struct sd_cluster*c=sd_connect(“192.168.1.104:7000”);
如果(!c){
fprintf(stderr,“无法连接%m\n”);
返回-1;
}否则{
fprintf(stderr,“已成功连接%m\n”);
}
返回0;
}
现在,当我使用以下命令编译时:
g++-o test.cpp-lsheepdog-lpthread
我得到这个错误:
你不能只在一个头上包上<代码>外“C”<代码>,并希望它在C++程序中编译。例如,标题sheepdog_proto.h
使用名为new
的参数;这是C++中的关键字,所以没有办法编译成C++。图书馆不是设计为C++的。 < P>我同意@ PeteBecker。快速浏览一下谷歌,我不确定是否有一个简单的解决方案。牧羊犬使用C特征和名称,它们不能很好地移植到C++。你可能需要相当广泛地攻击牧羊犬。例如:
- 将
函数从inline
移到新的C文件中,保留原型。这应该考虑到错误的sheepdog_proto.h
偏移量,例如中讨论的李>
#在
sheepdog/sheepdog.h
以及为了使其编译而必须进行的任何其他特定更改。由于专家没有设计出可用于C++的程序,所以你应该用C语言来构建一个小包装器来调用牧羊犬的函数,并且只从C++代码中调用包装器。编写此类包装器的一些提示:
传递不透明指针非常好void*
- 提取器可以帮助访问名称不正确的成员。如果结构有一个名为
(类型为T)的成员,则可以编写:new
及T getNew(void *otherstruct); // declaration in .h
无论如何,链接器允许在C和C++中编译混合模块,无论是静态链接还是动态链接。
用G++-O测试程序。CPP -L/绝对伏特加/路径/ to/牧羊犬-lpthread@Phiber对于露齿而笑的人也有同样的问题,您是否先在没有外部“C”的情况下尝试过?是牧羊犬/sheepdog.h
?(我在GitHub中的include/
下没有看到sheepdog/sheepdog.h
)您似乎也有include头的问题,尝试使用:g++-I/sheepdog/headers或设置CPLUS_INCLUDE_PATH envvariable@cxw是的,我试过了,同样的错误happened@PeteBecker如果我在C++中使用C++创建这个库,它提供了我在C++程序中需要的函数,然后将它与我的C++程序连接起来。这个工作<代码>定义新的…<代码>产生未定义的。彼得·贝克尔在这种情况下的行为?对于牧羊犬,我认为new
只是一个像其他标识符一样容易被重新定义的标识符。Sheepdog没有对操作符new
的调用,因此编译器没有理由专门处理名为foo_new
的东西。我错过什么了吗?--我还发现了一个模糊相关的问题:).cxw——用宏重新定义任何C++关键字会产生未定义的行为。这可能是无害的,但这并不能改变它的本质。对于这篇文章的未来读者-