引入:在测试"extern "C" 与gcc, g++无关"时,使用到了extern "C"的概念,网上找篇文章回顾一下。

试验如下:

test.h:

extern "C" void CppPrintf(void);

test.cpp:
#include <iostream>

#include "test.h"

using namespace std;

void  CppPrintf( void )  {  cout << "Hellon";  }

main.cpp:

#include <stdlib.h>

#include <stdio.h>

#include "test.h"

int  main( void ) {      CppPrintf();     return 0;  }

1. 先给 test.h 里的 void CppPrintf(void); 加上 extern "C",看用 gcc 和 g++ 命名有什么不同。

$ g++ -S test.cpp

$ less test.s

.globl  CppPrintf   <-- 注意此函数的命名

.type  CppPrintf , @function

$ gcc -S test.cpp

$ less test.s

.globl  CppPrintf   <-- 注意此函数的命名

.type  CppPrintf , @function

完全相同!

2. 去掉 test.h 里 void CppPrintf(void); 前面的 extern "C",看用 gcc 和 g++ 命名有什么不同。

$g++ -S test.cpp

$ less test.s

.globl  _Z9CppPrintfv   <-- 注意此函数的命名

.type  _Z9CppPrintfv , @function

$ gcc -S test.cpp

$ less test.s

.globl  _Z9CppPrintfv   <-- 注意此函数的命名

.type  _Z9CppPrintfv , @function

完全相同!


测试结论:  完全相同,可见 extern "C" 与采用 gcc 或 g++ 并无关系,  以上的试验还间接的印证了前面的说法:在编译阶段,g++ 是调用 gcc 的。

这里注意,使用extern "C" 必须加在c++文件中才起作用(包括通过include 头文件的方式间接包含)。

进入正题:

extern "C" 的含义使用参考如下链接:

http://blog.chinaunix.net/uid-21411227-id-1826909.html

关于extern "C"总结两条:

1、C++和C对产生的函数名字的处理是不一样的. 通过查看汇编文件(.s),可以看出区别。

2、为了在C++代码中调用用C写成的库文件,就需要用extern "C"来告诉编译器:这是一个用C写成的库文件,请用C的方式来链接它们。

extern "C" 回顾的更多相关文章

  1. [C#] C# 知识回顾 - 特性 Attribute

    C# 知识回顾 - 特性 Attribute [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5911289.html 目录 特性简介 使用特性 特性 ...

  2. #ifdef __cplusplus extern c #endif 的作用

    #ifdef __cplusplus // C++编译环境中才会定义__cplusplus (plus就是"+"的意思) extern "C" { // 告诉编 ...

  3. “#ifdef __cplusplus extern "C" { #endif”的定义-----C和C++的互相调用

    "#ifdef __cplusplus extern "C" { #endif"的定义 看一些程序的时候老是有 "#ifdef __cplusplus ...

  4. extern "C"的用法

    文章转自开源电子论坛:http://www.openedv.com/forum.php?mod=viewthread&tid=7986 看一些程序的时候老是有 “#ifdef __cplusp ...

  5. C++ 基础知识回顾总结

    一.前言 为啥要写这篇博客?答:之前学习的C和C++相关的知识,早就被自己忘到一边去了.但是,随着音视频的学习的不断深入,和C/C++打交道的次数越来越多,看代码是没问题的,但是真到自己操刀去写一些代 ...

  6. Delphi XE7调用C++动态库出现乱码问题回顾

    事情源于有个客户需使用我们C++的中间件动态库来跟设备连接通讯,但是传入以及传出的字符串指针格式都不正确(出现乱码或是被截断),估计是字符编码的问题导致.以下是解决问题的过程: 我们C++中间件动态库 ...

  7. #ifdef __cplusplus extern "C" { #endif”的定义的含义

    看一些程序的时候老是有“#ifdef __cplusplusextern "C" {#endif”的定义,搞搞清楚是怎么回事: Microsoft-Specific Predefi ...

  8. 备忘录:“#ifdef __cplusplus extern "C" { #endif”的定义

    看一些程序的时候老是有“#ifdef __cplusplusextern "C" {#endif”的定义,搞搞清楚是怎么回事: Microsoft-Specific Predefi ...

  9. [C#] C# 基础回顾 - 匿名方法

    C# 基础回顾 - 匿名方法 目录 简介 匿名方法的参数使用范围 委托示例 简介 在 C# 2.0 之前的版本中,我们创建委托的唯一形式 -- 命名方法. 而 C# 2.0 -- 引进了匿名方法,在 ...

随机推荐

  1. 图解项目管理流程:禅道&JIRA中的操作

    禅道作为优秀的国产开源项目管理软件,禅道集产品管理.项目管理.质量管理.文档管理.组织管理和事务管理于一体,完整覆盖了研发项目管理的核心流程.禅道的设计理念在于提供一体化的解决方案,流程图完整呈现了项 ...

  2. Study 6 —— while循环

    语法while 条件: 执行代码... 1. #从0打印到100,每循环一次 +1 count = 0 while count <= 100 : print('Loop: ', count) c ...

  3. spring中用到了哪些设计模式

    spring中用到了哪些设计模式?(顺丰) spring中常用的设计模式达到九种,我们举例说明: 第一种:简单工厂 又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种G ...

  4. WebSocket 实战之——【WebSocket 原理】

    一.WebSocket是什么? HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算). 首先HTTP有1.1和1.0之说,也就 ...

  5. ipython 编辑器 jupyter notebook如何将 ipynb 转成 py 并在 jupyter notebook 中继续引用

    首先将 要被做成 module 的 ipython 代码 download as py 然后将 down 下来的 py 文件上传至 work 目录(也就是编写导入模块的py文件目录) 这部分 的 wo ...

  6. Linux 环境变量问题

    环境变量延伸: /etc/profile, /etc/bashrc, .bash_profile和.bashrc的差别 用户在登陆Linux操作系统的时候,"/etc/profile&quo ...

  7. SSH开发环境搭建

    断断续续学习hibernate也有一段时间了,在这里研究一下SSH开发环境的搭建过程,自己简单的搭建一个SSH的开发环境.采用maven搭建. 0.项目结构: 1.导包:(maven项目) pom.x ...

  8. pandas 定位 loc,iloc,ix

    In [114]: df Out[114]: A B C D 2018-06-30 0.318501 0.613145 0.485612 0.918663 2018-07-31 0.614796 0. ...

  9. Python中的元类

    从前面"Python对象"文章中了解到,在Python中一切都是对象,类可以创建实例对象,但是类本身也是对象. class C(object): pass c = C() prin ...

  10. 【转】Python之文件读写

    [转]Python之文件读写 本节内容: I/O操作概述 文件读写实现原理与操作步骤 文件打开模式 Python文件操作步骤示例 Python文件读取相关方法 文件读写与字符编码 一.I/O操作概述 ...