gcc 与 g++ 的区别

2023-11-06

gcc 和 g++

  • GCC:GNU Compiler Collection(GUN 编译器集合);

  • g++ 是 GCC 中的 GUN C++ Compiler(C++编译器)。

在已编译好的 C 或者 C++ 代码的前提下,GCC 编译器已提供了调用接口,可以通过执行 gcc 或者 g++ 指令来调用 GCC 编译器,两者都可以编译 C 或者 C++ 语言程序,但这不是两者的区别。

实际上只要是 GCC 支持编译的程序代码,都可以使用 gcc 命令完成编译,可以说 gcc 是 GCC 编译器的通用编译指令,因为 gcc 指令根据程序文件的后缀名可以执行判断出当前程序所用编程语言的类别:

  • xxx.c:默认以编译 C 语言程序的方式编译此文件;

  • xxx.cpp:默认以编译 C++ 语言程序的方式编译此文件;

  • xxx.m:默认以编译 Objective-C 语言程序的方式编译此文件;

  • xxx.go:默认以编译 Go 语言程序的方式编译此文件;

  1. gcc 指令对 .c 文件则以 C 语言代码对待,对 .cpp 文件则以 C++ 代码对待;

  2. g++ 指令对.c 或者 .cpp 文件则都以 C++ 代码对待;

  3. gcc 指令编译执行 C++ 程序,需要添加命令使得链接必要的 C++ 标准库:

[root@bogon ~]# gcc -xc++ demo.cpp -lstdc++ -shared-libgcc

  1. 使用g++编译文件时,g++会自动链接标准库STL,而gcc不会自动链接STL

命名倾轧(函数重载及原理)

函数重载

C 语言中一个函数不能与另一个函数重名;C++ 中只要函数的参数列表与另一函数的参数列表不完全相同,函数名就可以相同。

重载原则

  1. 函数名相同,函数参数列表不同(类型、个数、顺序);
  2. 匹配原则1:严格匹配,找到再调用;
  3. 匹配原则2:通过隐式类型转换寻求一个匹配,找到再调用;
  4. 返回值类型不构成重载条件。

重载实现原理

利用 name mangling(倾轧)技术对函数名进行更改,区分参数不同的同名函数。

  • ​编译器通过函数名和参数类型识别重载函数。为了保证类型安全的连接(type-safe linkage),编译器用参数个数和参数类型对每一个函数标识符进行专门编码(名字改编:name mangling 或者 名字修饰:name decoration)。

  • ​类型安全的连接使得程序能够调用合适的重载函数并保证了参数传递的一致性,编译器能够检查到并报告连接错误。

查看符号表

  1. nm 目标文件;
  2. objdump -t 目标文件;
  3. readelf -s 目标文件
  4. strings 目标文件

GCC 自动识别的文件扩展名

文件名 + 扩展名 GCC 编译器识别的类型
file.c 尚未经过预处理的C 源程序文件
file.j 经过预处理操作,但未进行编译、汇编和连接的 C 源代码文件
file.cpp
file.cp
file.cc
file.cxx
file.CPP
file.c++
file.C
尚未经过预处理操作的 C++ 源代码文件
file.ii 经过预处理操作,但未进行编译、汇编和连接的 C++ 源代码文件
file.s 经过编译生成的汇编代码文件
file.h C、C++或者 Objective-C++ 语言头文件
file.h
hfile.H
file.hp
file.hxx
file.hpp
file.HPP
file.h++
file.tcc
C++ 头文件

命名反倾轧

c++filt _Z4funci

查看反倾轧的符号表

nm -C 目标文件
objdump -t -C 目标文件

禁用命名倾轧

C++ 命名倾轧的函数无法被 C 调用。C++ 函数必须是没有倾轧的才能调用。

使用声明 extern "C" 禁止命名倾轧:

#ifndef __CPP_H_
#define __CPP_H_

#ifdef __cplusplus
extern "C" {
#endif // __cplusplus

int fun(int n);

#ifdef __cplusplus
}
#endif // __cplusplus

#endif // __CPP_H_

编译

函数声明 编译器 编译函数符号 查找函数符号
void func(int) g++ _Z4funci _Z4funci
void func(int) gcc func func
extern "C" void func(int) g++ func func
extern "C" void func(int) gcc 错误
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

gcc 与 g++ 的区别 的相关文章

随机推荐

  • 目标跟踪(OTB100、GOT10K、LaSOT)数据集pysot测试结果

    论文画图 必不可少的测试结果 因为接触跟踪较晚 且对于matlab实在是不熟悉 所以最开始直接尝试的就是pysot进行曲线图 各算法比较框图的绘制 但是最近因为写论文需要画图 发现一些算法的txt文件实在难找 所以写下了这个帖子 目前并不全
  • 键盘盲打练习打字软件 v6.30绿色版

    点击下载来源 键盘盲打练习打字软件 v6 30绿色版 键盘盲打练习是一款字母和数字相结合的键盘打字练习软件 跟其他同性质功能软件相比较 它最大的特点是 眼睛不用看键盘 击闪烁的键 仔细体会 单击鼠标右键或按Alt A键 可弹出快捷菜单 非常
  • # STM32错误积累01:error: #11-D: unrecognized preprocessing directive

    解决办法 在 ifndef 与 define 后加上一个空格
  • docker安装kafka

    Kafka 是一个分布式流媒体平台 类似于消息队列或企业消息传递系统 kafka介绍 名词解释 producer 发布消息的对象称之为主题生产者 Kafka topic producer topic Kafka 将消息分门别类 每一类的消息
  • 【多模态】14、Segment Anything

    文章目录 一 Intruduction 二 Segment Anything Task 三 Segment Anything Model 四 Segment Anything Data Engine 五 Segment Anything D
  • 关于Qt pro、pri、qmake、Makefile的资源整理

    QT中PRO文件写法的详细介绍 如何在Qt Creator中创建pri文件 以及pri文件的说明 qmake的使用 跟我一起写 Makefile 一 推荐大家仔细看陈皓的和我一起写Makefile 可以通透makefile的工作原理 其次里
  • 林园价值交易策略

    文章目录 选股策略 林园6条炒股 心经 选股策略 选股时可以考虑在低市盈率 高分红的绩优龙头股和确定性高的小盘股中选 所选择的上市公司的财务指标需符合七大标准 每股盈利不低于0 3元 净利润不少于7000万元 毛利率在20 以上 净资产回报
  • 病毒反调试跟踪

    跟踪一个反调试巨多的病毒样本 1 调用 QueryPerformanceCounter反调试 这个API调用了封装ZwQueryPerformanceCounter系统调用的ntdll NtQueryPerformanceCounter 0
  • 什么是mvvm模式

    MVVM 是把 MVC 的 Controller 和 MVP 的 Presenter 改成了 ViewModel View 的变化会 动更新到 ViewModel ViewModel 的变化也会 动同步到 View 上显示 这种 动 同步是
  • vue-cli3.0 多核编译ts及内存配置(解决项目过大编译内存溢出)

    主要配置webpack插件ForkTsChecker 在vue config js中配置 module exports configureWebpack config gt 多核启动编译及内存提升 const data config plu
  • 区块链将如何改变服装、改变时尚?

    越来越多的服装公司开始注意到在某些情况下 它们需要改变自己的商业模式 以耐克为例 他们不再把自己定位成一家服装公司 相反 他们说自己是一家科技公司 碰巧生产服装 他们的衣服和鞋子通常都装有传感器 用于跟踪心率 英里数或卡路里燃烧情况 这是因
  • MySQL - 表字段的默认值约束

    设置表字段的默认值 DEFAULT 当为数据库表中插入一条新记录时 如果没有为某个字段赋值 数据库系统就会自动为这个字段插入默认值 为了达到这种效果 可通过SQL语句关键字DEFAULT来设置 设置数据库表中某字段的默认值非常简单 可以在M
  • Vue UI 组件库大起底 element VS iview VS ...

    最近接触了几个开源项目 发现大家都在用iview框架 趁机整理一下自己接触过的几个基于Vue js的UI组件库 Element 一套为开发者 设计师和产品经理准备的基于 Vue 2 0 的桌面端组件库 由饿了么前端开源的UI框架 主要用于开
  • Java多线程实现抢票

    1 1抢票系统 多人抢票 package Demo8 多个线程同时操作一个对象 买车票例子 public class TestThread4 implements Runnable private int ticket nums 10 Ov
  • Couldn't read row 0, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before

    在做项目时碰到一个问题 就是一直报 java lang IllegalStateException Couldn t read row 0 col 1 from CursorWindow Make sure the Cursor is in
  • QML设计登陆界面

    QML设计登陆界面 本文博客链接 http blog csdn net jdh99 作者 jdh 转载请注明 环境 主机 WIN7 开发环境 Qt5 2 说明 用QML设计一个应用的登陆界面 效果图 源代码 main qml javascr
  • python数据处理中的日期转换处理中的to_datetime()函数(一)

    python使用的是 jupyter notebook 话不多说 直接说说主要内容吧 一 函数简介 我们可以通过输入 import pandas as pd help pd to datetime 可以得到to datetime函数的相关作
  • 第三方登录之微信扫码登录

    文章目录 1 申请微信接入 2 项目环境搭建 3 后端Controller接口 4 HTML页面代码 5 测试结果 6 补充说明 小伙伴们有各种疑问可以去参考官方文档进行详细的学习下 微信开发文档 此次介绍的将是前后端不分离的微信扫码登录
  • 2022微信小程序填充昵称头像 open-type=“chooseAvatar“

    2021年7月份之后 微信开始加强对微信用户个人信息的安全防控 收回了相关服务端接口 微信后面也推出了前端填写昵称头像的方法 官方代码如下
  • gcc 与 g++ 的区别

    gcc 和 g GCC GNU Compiler Collection GUN 编译器集合 g 是 GCC 中的 GUN C Compiler C 编译器 在已编译好的 C 或者 C 代码的前提下 GCC 编译器已提供了调用接口 可以通过执