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 的方式处理符号名。