You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
出于一些不可抗力、历史原因,我们不得不在 C++ 中使用一些 C 语言代码(甚至古老的 C 语言代码),例如 Linux 系统调用。在 C++11 出现之前,大部分人当谈及『C 与 C++ 的区别是什么』时,普遍除了回答面向对象的类特性、泛型编程的模板特性外,就没有其他的看法了,甚至直接回答『差不多』,也是大有人在。下面的韦恩图大致上回答了 C 和 C++ 相关的兼容情况:
36
+
出于一些不可抗力、历史原因,我们不得不在 C++ 中使用一些 C 语言代码(甚至古老的 C 语言代码),例如 Linux 系统调用。在 C++1x 出现之前,大部分人当谈及『C 与 C++ 的区别是什么』时,普遍除了回答面向对象的类特性、泛型编程的模板特性外,就没有其他的看法了,甚至直接回答『差不多』,也是大有人在。图 1.2 中的韦恩图大致上回答了 C 和 C++ 相关的兼容情况。
32
37
33
-

38
+

34
39
35
-
从现在开始,你的脑子里应该树立**『C++ 不是 C 的一个超集』**这个观念(而且从一开始就不是,后面的进一步阅读的参考文献中给出了 C++98 和 C99 之间的区别)。在编写 C++ 时,也应该尽可能的避免使用诸如 `void*` 之类的程序风格。而在不得不使用 C 时,应该注意使用 `extern "C"` 这种特性,将 C 语言的代码与 C++代码进行分离编译,再统一链接这种做法,例如:
40
+
从现在开始,你的脑子里应该树立**『C++ 不是 C 的一个超集』**这个观念(而且从一开始就不是,后面的[进一步阅读的参考文献](#进一步阅读的参考文献)中给出了 C++98 和 C99 之间的区别)。在编写 C++ 时,也应该尽可能的避免使用诸如 `void*` 之类的程序风格。而在不得不使用 C 时,应该注意使用 `extern "C"` 这种特性,将 C 语言的代码与 C++代码进行分离编译,再统一链接这种做法,例如:
36
41
37
-
```c
42
+
```cpp
38
43
// foo.h
39
44
#ifdef __cplusplus
40
45
extern "C" {
@@ -48,32 +53,76 @@ int add(int x, int y);
48
53
49
54
// foo.c
50
55
int add(int x, int y) {
51
-
reutrn x+y;
56
+
reutrn x+y;
52
57
}
53
58
54
-
// main.cpp
59
+
// 1.1.cpp
55
60
#include "foo.h"
61
+
#include <iostream>
62
+
#include <functional>
63
+
56
64
int main() {
57
-
add(1, 2);
58
-
return 0;
65
+
[out = std::ref(std::cout << "Result from C code: " << add(1, 2))](){
0 commit comments