当前位置:  编程技术>php开源软件 iis7站长之家

C++中extern "C"的用法

    来源: 互联网  发布时间:2014-10-27

    本文导语:  学习过C++的人都知道,extern关键字可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。这里起到的是声明作用范围的用处。另外,extern还可以与”C”...

学习过C++的人都知道,extern关键字可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。这里起到的是声明作用范围的用处。另外,extern还可以与”C”连用,作为链接指示。本文就此进行实例说明如下:

一、C++名字修饰(Name Mangling)

首先需要从C++的重载说起,在C++中函数重载指的是几个函数的函数名相同,参数列表不同。那么当生成obj中间文件/目标文件的时候,C++编译器如何区分这几个重载函数呢?可以通过把原函数名与参数信息结合,产生一个独特的内部名字,这种技术叫做名字修饰(Name Mangling)。名字修饰规则没有一个标准,所以不同的编译器的名字修饰规则也不一样。

下面是一组函数,其中f()函数重载了:

int f (void) { return 1; } 
int f (int) { return 0; } 
void g (void) { int i = f(), j = f(0); } 

f(void)和f(int)是不同的函数,除了函数名相同以外没有任何关系。当生成obj目标文件时,为了区分它们,C++编译器根据参数信息进行了名字修饰:

int __f_v (void) { return 1; } 
int __f_i (int) { return 0; } 
void __g_v (void) { int i = __f_v(), j = __f_i(0); }

注意g()也被名字修饰了,虽然没有任何名字冲突。名字修饰应用于C++的任何符号。

二、为什么要使用extern “C”?

C语言中没有名字修饰(Name Mangling),因为C语言不支持函数重载。但是如果C++中含有C代码,在编译时C++编译器对C代码的函数也会进行名字修饰,函数名变了以后,将导致在C运行库中找不到对应函数,发生链接错误。

// 将下面的代码保存为.cpp文件,并用C++编译器编译 
int printf(const char *format,...); 
  
int main() 
{ 
  printf("GeeksforGeeks"); 
  return 0; 
}

输出:

/tmp/ccQBO9Im.o:在函数‘main'中: 
test.cpp:(.text+0xf):对‘printf(char const*, ...)'未定义的引用 
collect2: 错误:ld 返回 1 

为了防止C++编译器对C代码进行名字修饰,我们将C代码用extern “C”进行链接指定,告诉编译器,在生成中间文件时,不要对这部分代码进行名字修饰,而是生成符合C规则的中间符号名。

extern "C" 
{ 
  int printf(const char *format,...); 
} 
 
int main() 
{ 
  printf("Hello!"); 
  return 0; 
}

添加了extern “C”链接指示后,上面的代码就能够正常运行了。

附:所有的C风格的头文件(stdio.h, string.h, … 等等)都有在extern “C”下声明,形式如下:

#ifdef __cplusplus  
extern "C" { 
#endif 
  /* Declarations of this file */ 
#ifdef __cplusplus 
} 
#endif

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间javax.xml.stream类xmlinputfactory成员方法: is_supporting_external_entities定义参考
  • 请问只有变量只有extern 形式 但是删去extern 之后 会有 multiple defination error
  • 一个弱弱的问题:关于extern的使用
  • mod_auth_external
  • extern 的疑问:
  • extern "C" 在linux上的问题
  • 关于QT的extern,如何引进一个结构体
  • 网卡external loopback测试程序
  • 请高手帮我解释这句话extern __FAR__ GT_Config *GT;
  • 上次问题解决了,原来是extern被重定义了。。。天阿,关键字也可以被重定义。。。。。欢迎接分
  • 简单问题:Unix下使用extern关键字的标准C程序如何编译?比如...
  • error LNK2001: unresolved external symbol 求助
  • 请教,extern使用出错(很小的程序)
  • Linux下使用extern如何写makefile
  • 关于error LNK2001: unresolved external symbol 的一个发现
  • C/C++中extern "C" 的作用分析
  • 提示出现unresolved external symbol _main的解决方法
  • 浅谈C/C++中的static与extern关键字的使用详解
  • 深入理解C语言 static、extern与指针函数
  • extern char** environ这个变量是从哪来的??
  • windows下的QT编译问题:链接时提示某些虚函数 unresolved external symbol


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3