当前位置: 首页 > news >正文

c编译和c++编译有什么区别?

文章目录

  • c编译和c++编译有什么区别
      • 多态
        • 函数重载
        • 虚函数表 vtable
      • 输入输出同步
      • 类型检查
      • 模板和特化
      • 链接 C++ 标准库
    • C++ 能编译 C 的代码吗?

c编译和c++编译有什么区别

多态

函数重载

C++ 支持多个同名函数(参数不同),这是编译期多态

编译器需要在编译阶段进行重载决议(Overload Resolution)

  • 编译器要收集更多函数签名信息;

  • 编译的符号名需要进行 name mangling(名称修饰),比如 _Z3fooi 表示 foo(int);

_Z 是 GCC 名称修饰的前缀,3 表示函数名的长度,foo 是函数名,i 表示一个 int 类型的参数
两个int用ii,两个double用dd

虚函数表 vtable

尽管是运行时多态,也需要编译时生成 虚函数表和指针

输入输出同步

iostream 默认与 stdio 同步

iostream 类型安全,重载 <<, >> 运算符,无需格式字符串.
<通过函数重载机制>

类型检查

C++更严格, 不允许隐式把 void* 转成 int*

模板和特化

模板:编写与类型无关的代码

让 iostream 能够支持用户定义类型的输入输出

class Point {
public:
    int x, y;
};

std::ostream& operator<<(std::ostream& os, const Point& p) {
    return os << "(" << p.x << ", " << p.y << ")";
}

链接 C++ 标准库

C++ 程序除了链接 C 标准库外,还需要链接到 C++ 标准库。

C++ 能编译 C 的代码吗?

不完全能。

  • c++ 不允许 void* 自动类型转换
  • struct 在 C 中必须加上

在 C++ 中编译 C 文件,最好加上:

extern "C" {
    #include "c_header.h" 
}

关闭 C++ 的 name mangling,让编译器用 C 的方式处理符号名。

相关文章:

  • PolarDB 读已提交事务隔离级别 select ... for update, where条件未用索引,查不到数据的时候不会锁表
  • 游戏引擎学习第209天
  • 第十届 蓝桥杯 嵌入式 省赛
  • 前端知识(vue3)
  • Python 字典和集合(常见的映射方法)
  • 【学Rust写CAD】39 over_in_in 函数(alpha256补充方法)
  • JS中的Promise对象
  • 源代码保密解决方案
  • linux上todesk无法使用问题
  • 避免误用strncmp与memcmp,strcpy与memcpy
  • CSS中的inline-flex与flex的区别
  • 在C++11及后续标准中,auto和decltype是用于类型推导的关键特性,它们的作用和用法。
  • 力扣热题100刷题day62|283.移动零、39.组合总和、94.二叉树的中序遍历
  • 百度开放平台调用动物识别接口
  • 运营商在网状态查询API:精准探测手机号的状态
  • LLM Agent未来研究趋势
  • 前后端开发规范
  • 好数(蓝桥杯2024省赛B组)
  • Win11重新设计开始菜单 变成iOS样式
  • 【Linux】Git的简单使用
  • 网站建设 顺德/seo会被取代吗
  • 素材网站/360识图
  • 如果只做p2p种子搜索网站/nba新闻最新消息
  • 软件工程专业就业方向及前景分析/seo是做什么的
  • 网站建设 计算机软件开发税点/真正免费的网站建站平台运营
  • 大连网站建设在线/百度快照功能