C++中的extern C
来源:互联网 发布:淘宝aⅴ首页 编辑:程序博客网 时间:2024/06/09 21:29
本文主要讨论C++中extern C的使用。
在使用extern "C"声明时,有两种不同的形式:一是extern "C"后跟函数(或者变量)声明;另外就是extern "C"{函数(或变量)声明}。第一种形式(inline form)表示同时声明为外部连接和C风格连接;而第二种形式仅声明为C风格连接(并不附带外部声明)。例如:
//第一种形式
extern "C" int foo; //外部变量声明并且C风格连接
extern "C" void bar(); //外部函数声明并且C风格连接,此时就不能为static
//第二种形式
extern "C" {
int foo; //C风格连接,并且定义变量(不是外部连接声明!)
void bar();
}
所以当将第二种形式改写成如下形式时,两种形式才具有等价性:
//第二种形式修改
extern "C" {
extern int foo; //这儿的extern声明其作用对象为外部连接
extern void bar();
}
对于有extern "C"声明的函数,其作用只是改变了函数的连接形式(采用C风格,即在目标文件中的符号名与函数名相同),并非改变函数的性质(也就是说被修饰的C++函数还可照常使用C++语言特性,与一般的C++函数除了多了个修饰之外,从外表上看并没有其它区别)。从如下示例程序中可以更清楚地看到这点:
// A.h
#ifndef MY_A_H
#define MY_A_H
#include <iostream>
class A
{
public:
void print()
{
std::cout<<"Message from class A"<<std::endl;
}
};
#endif //MY_A_H
////////////////////////////////////////////////////
// func.cpp
#include "A.h"
extern "C"
void func(A& a)
{
int* p=new int[23];
// test new operator
*p=1;
a.print();
delete [] p;
}
////////////////////////////////////////////////
// main.cpp
#include "A.h"
extern "C" void func(A& a);
int main()
{
A a;
func(a);
return 0;
}
另外,标准中规定这种形式是非法的:
extern "C" static void f(); // error
因为extern "C"表明它是外部连接的,与static矛盾(多存储类型声明错误)。但在VC6.0和MinGW2.05上这样声明却没有错误,不知道为什么会这样 。不过,在定义时:
extern "C" static void f(){...} // error
在VC6.0中没有编译错误,但会有连接错误(main中找不到func的定义);而MinGW2.05有编译错误(多个存储类型声明错误)。看来,MinGW工作得更好些。
使用extern "C"的一个很重要的因素是关于从动态库里提取函数等问题的需要,见下面的参考文献[2]。
参考文献:
[1]ISO-IEC-14882-1998.pdf, 7.5
[2]关于从动态库里提取对象:http://www.isotton.com/howtos/C++-dlopen-mini-HOWTO/C++-dlopen-mini-HOWTO.html#seealso
- C/C++中的extern
- c中的extern用法
- C++中的extern C
- C++中的extern C
- C++中的 extern "c"
- C++中的extern C
- C语言中的extern
- C中的static、extern、#、##
- C++中的extern "C" {}
- c语言中的extern
- c语言中的 extern
- c++中的extern "C"
- c++中的 extern "C"
- C++ 中的 extern “C”
- c++中的 extern "C"
- C/C++中的extern
- c++中的 extern "C"
- C++中的 extern "C"
- Linux——chmod命令用法
- SQL alter
- Silverlight中更改在验证绑定中错误提示的样式。
- 转:SSO解决方案大全 Single Sign-On for everyone(统一用户认证)
- Android高手进阶教程(一)-------Android常用名令集锦(图文并茂)!
- C++中的extern C
- JSP中大于号小于号的转义字符
- AppEngine中允许使用session
- Linux 驱动开发
- JAVA基础--JAVA中的反射机制详解
- how websites are perceived by their visitors and the basic ways in which websites can be constructed.
- GestureDetector
- mysql my.cnf 配置建议
- VC下揭开“特洛伊木马”的隐藏面纱