c++在进行c编译时,为什么要声明extent c
6个回答
展开全部
你要知道 有的时候 需要用c编译的程序调用c++编译的库或者c++源码里面的函数和类,
但是c和c++对于函数的处理是不同的,
比如说c编译函数的话,如void fun()处理后之后可能就是fun,
然而c++的话,可能会在前面加上很多修饰的前缀,就不是fun了,可能是什么g_fun,
具体我也不清楚,
由于c和c++对函数的处理方式不同的话,你在c++写函数要让c语言可以调用,那么就要加个东西表示要按c的方式编译函数,这就是加个extern "c"了,在c++语言里面使用c方式的函数,声明的时候也要加上extern "c"告诉编译器按c的方式去查找这个函数,否则的话可能会出现链接错误,
具体的详细说明可以去查询相关资料啊。。。c++ primer 4里面的最后一章好像有点说明,讲的简单明了,可以去看看哦。。。
关于文件后缀名是c还是cpp的,在vc6和vs2008等下面都是 分别按照对应语言处理的,要让编译器只按照c语法处理的话,要把后缀改成.c的,否则默认情况.cpp的话,即使源码里面是纯c的语法,还是会按照c++处理的,所以编译方式还是c++的,就体现不出extern "c"的作用了,要想体现出作用的话,可以建立.c和.cpp的文件或者工程尝试下。。。
但是c和c++对于函数的处理是不同的,
比如说c编译函数的话,如void fun()处理后之后可能就是fun,
然而c++的话,可能会在前面加上很多修饰的前缀,就不是fun了,可能是什么g_fun,
具体我也不清楚,
由于c和c++对函数的处理方式不同的话,你在c++写函数要让c语言可以调用,那么就要加个东西表示要按c的方式编译函数,这就是加个extern "c"了,在c++语言里面使用c方式的函数,声明的时候也要加上extern "c"告诉编译器按c的方式去查找这个函数,否则的话可能会出现链接错误,
具体的详细说明可以去查询相关资料啊。。。c++ primer 4里面的最后一章好像有点说明,讲的简单明了,可以去看看哦。。。
关于文件后缀名是c还是cpp的,在vc6和vs2008等下面都是 分别按照对应语言处理的,要让编译器只按照c语法处理的话,要把后缀改成.c的,否则默认情况.cpp的话,即使源码里面是纯c的语法,还是会按照c++处理的,所以编译方式还是c++的,就体现不出extern "c"的作用了,要想体现出作用的话,可以建立.c和.cpp的文件或者工程尝试下。。。
展开全部
这个问题以前还真没碰到过。现从网上找的,看的还不太透彻,额。
好像是在一种语言的源程序中去引用在另一种语言的源程序中定义的函数时会用到。大概是因为C++和C的编译器对变量名、函数名之类名称的处理方式不同(例如C++必须始终保证对函数重载的支持,即使只有一个同名的函数也要按重载的方式来处理,而C没有这一说的),在C++代码中直接引用C文件中的函数而不通过extern c打招呼的话,C++编译器按照默认的方式去连接obj文件时会很悲剧,大体就是这个样子吧。
记得以前用VC6.0编译.c文件时感觉很别扭,还是习惯写成.cpp交给它去编译,不知道是不是和这个有关。虽然写的是C语言风格的程序,但是只要写在.cpp文件里面了,它就是C++的了。
下面两点是那篇参考文章的作者总结的。
1、被extern "C" 限定的函数或变量是 extern 类型的。
2、被 extern "C" 修饰的变量和函数是按照 C 语言方式编译和链接的。
PS:*3*、C++文件引用C文件中的函数/变量(需要让C++编译器识别C的东西),或C文件中引用C++文件中的函数/变量(需要照顾C编译器),此时需要在C++文件中写extern c
好像是在一种语言的源程序中去引用在另一种语言的源程序中定义的函数时会用到。大概是因为C++和C的编译器对变量名、函数名之类名称的处理方式不同(例如C++必须始终保证对函数重载的支持,即使只有一个同名的函数也要按重载的方式来处理,而C没有这一说的),在C++代码中直接引用C文件中的函数而不通过extern c打招呼的话,C++编译器按照默认的方式去连接obj文件时会很悲剧,大体就是这个样子吧。
记得以前用VC6.0编译.c文件时感觉很别扭,还是习惯写成.cpp交给它去编译,不知道是不是和这个有关。虽然写的是C语言风格的程序,但是只要写在.cpp文件里面了,它就是C++的了。
下面两点是那篇参考文章的作者总结的。
1、被extern "C" 限定的函数或变量是 extern 类型的。
2、被 extern "C" 修饰的变量和函数是按照 C 语言方式编译和链接的。
PS:*3*、C++文件引用C文件中的函数/变量(需要让C++编译器识别C的东西),或C文件中引用C++文件中的函数/变量(需要照顾C编译器),此时需要在C++文件中写extern c
参考资料: http://codingdao.com/wp/post/cpp-extern-c-note/
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你写错了,是extern C
C++保留了一部分过程式语言的特点,因而它可以定义不属于任何类的全局变量和函数。但是,C++毕竟是一种面向对象的程序设计语言,为了支持函数的重载,C++对全局函数的处理方式与C有明显的不同。
extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般之包括函数名。
比如说你用C 开发了一个DLL 库,为了能够让C ++语言也能够调用你的DLL输出(Export)的函数,你需要用extern "C"来强制编译器不要修改你的函数名。
C++保留了一部分过程式语言的特点,因而它可以定义不属于任何类的全局变量和函数。但是,C++毕竟是一种面向对象的程序设计语言,为了支持函数的重载,C++对全局函数的处理方式与C有明显的不同。
extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般之包括函数名。
比如说你用C 开发了一个DLL 库,为了能够让C ++语言也能够调用你的DLL输出(Export)的函数,你需要用extern "C"来强制编译器不要修改你的函数名。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
应该跟特定的编译器有关,2010的还像还要加另外一个头文件
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这样才能使用c的函数库。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询