被弃用的特性
〼不再允许字符串字面值常量赋值给一个 char *
(讲真,这一点真的很常用)
如果需要使用字符串字面值常量赋值和初始化一个 char *
,应该使用 const char*
或 auto
〼C++98、unexpected__handler、 set_unexpected() 等相关特性被弃用,转而使用
noexcept
〼auto_ptr 被弃用,应使用 unique_ptr
〼 register 关键字被弃用,可以使用但不再具备任何实际含义
〼 bool 类型的 ++ 操作被弃
〼 如果一个类有析构函数,为其生成拷贝构造函数和拷贝赋值运算符的特性被弃用了
〼 C 语言风格的类型转换被弃用(即在变量前使用 (convert_type)),应该使用 static_cast、reinterpret_cast、 const_cast 来进行类型转换
〼 特别地,在最新的 C++17 标准中弃用了一些可以使用的 C 标准库,例如 <ccomplex>
、<cstdalign>
、 <cstdbool>
与 <ctgmath>
等
与 C 的兼容性
出于一些不可抗力、历史原因,我们不得不在 C++ 中使用一些 C 语言代码。很多时候当被问到 C 与 C++ 的区别是什么,我们都会自然而然的想到:C++ 是 C 的一个超集
但是从这本书开始,我们将要树立一个观念:C++ 不是 C 的一个超集(原书的作者甚至给出了一个更加强烈的表达,C++ 从一开始就不是 C 的一个超集)
在编写 C++ 时,也应该尽可能的避免使用诸如 void*
之类的程序风格。而在不得不使用 C 时,应该注意使用 extern "C"
这种特性,将 C 语言的代码与 C++ 代码进行分离编译,再统一链接这种做法
// foo.h
#ifdef __cplusplus
extern "C" {
#endif
int add(int x, int y);
#ifdef __cplusplus
}
#endif
// foo.c
int add(int x, int y) {
return x+y;
}
// 1.1.cpp
#include "foo.h"
#include <iostream>
#include <functional>
int main() {
[out = std::ref(std::cout << "Result from C code: " << add(1, 2))](){
out.get()<< ".\n";}();
return 0;
}
对于上面的程序我们应该使用 gcc 编译 C 语言的代码 gcc -c foo.c
,编译出 foo.o
文件,在使用 clang++ 将 C++ 代码和 .o
文件链接起来 clang++ 1.1.cpp foo.o -std=c++2a -o 1.1
(或者我们也可以将它们都编译为 .o
文件再统一链接)