目录
问题2:C语言的内存管理-堆和栈和它们的优缺点、内存管理的算法
问题1: 关于C++的命名空间和C语言的标准库
C++引入了命名空间的概念,计划重新编写库,将类、函数等都统一纳入一个命名空间中(命名空间的名字是 std)。
但是这时已经有很多用老式C++开发的程序了,它们的代码中并没有使用命名空间,直接修改原来的库会带来一个很严重的后果:程序员会因为不愿花费大量时间修改老式代码而极力反抗,拒绝使用新标准的C++代码。
C++开发人员想了一个好办法,保留原来的库和头文件,它们在C++中可以继续使用。然后再把原来的库复制一份,在此基础上稍加修改,把类、函数等纳入命名空间 std 下,就成了新版C++标准库。这样共存在了两份功能相似的库,使用了老式C++的程序可以继续使用原来的库,新开发的程序可以使用新版的C++库。
新版C++也对头文件的命名做了调整,去掉了后缀.h,所以老式C++的 <iostream.h> 变成了 <iostream>,<fstream.h> 变成了 <fstream>。
而对于原来C语言的头文件,也采用同样的方法,但在每个名字前还要添加一个c
字母,所以C语言的 <string.h> 变成了 <cstring>,<stdio.h> 变成了 <cstdio>。
最后一点是,旧的C++头文件是官方所反对使用的,已明确提出不再支持,但旧的C头文件仍然可以使用,以保持对C的兼容性。实际上,编译器制造商不会停止对客户现有软件提供支持,所以可以预计,旧的C++头文件在未来几年内还是会被支持。
所以,实际来说,下面是C++头文件的现状:
旧的C++头文件,如 <iostream.h>、<fstream.h> 等将会继续被支持,尽管它们不在官方标准中。这些头文件的内容不在命名空间 std 中。
新的C++头文件,如 <iostream>、<fstream> 等包含的基本功能和对应的旧头文件相似,但头文件的内容在命名空间 std 中。
注意:在标准化的过程中,库中有些部分的细节被修改了,所以旧头文件和新头文件中的实体不一定完全对应。
标准C头文件如 <stdio.h>、<stdlib.h> 等继续被支持。头文件的内容不在 std 中。4) 具有C库功能的新C++头文件具有如 <cstdio>、<cstdlib> 这样的名字。它们提供的内容和相应的旧C头文件相同,只是内容在 std 中。
历史总结:
C++ 的头文件去掉了 .h 例如:<iostream.h> 变成了 <iostream>
C 的头文件为也去掉 .h 并且 在前面 添加了 c 例如:<string.h> 变成了 <cstring>
虽然可以不按照上面的做法,工程里的仍然可以使用,但容易混淆概念。所以,不要混合使用。
使用C++标准头文件
之前的演示,C语言的格式输出函数 printf,引入了头文件 stdio.h,这完全没有错误,因为C++兼容C。但在C++代码中我还是推荐使用C++的头文件,不要把C和C++代码混合在一起使用。
例如,如果你打算使用printf 函数,那么应该引入 <cstdio>,并使用命名空间 std,如下所示:
#include <cstdio>
using namespace std;
虽然 using namespace std 是防止命名空间被污染,但是项目中的头文件里推荐少用或不用。因为直接using会把整个空间里的东西全部引入。很容易造成冲突。
C语言中文网 我真的很想要这个网站的会员 但是我买不起 一个就要159一年
问题2:C语言的内存管理-堆和栈和它们的优缺点、内存管理的算法
C语言内存管理 - b站视频
深入C程序原理和C内存结构 b站视频 还没看
问题3:C语言静态库和动态库的使用
问题4:typedef的作用
以下内容来自此链接 我的问题是:我感觉我并不需要简洁的类型名称?因为我觉得不用这样的简洁的东西我更容易看懂代码发生了什么?
在实际使用中,typedef 的应用主要有如下4种。
1) 为基本数据类型定义新的类型名
2) 为自定义数据类型(结构体、共用体和枚举类型)定义简洁的类型名称
3) 为数组定义简洁的类型名称
4) 为指针定义简洁的名称
接下来看一个简单的 typedef 使用示例,如下面的代码所示:
typedef char* PCHAR;
int strcmp(const PCHAR,const PCHAR);
在上面的代码中,“const PCHAR” 是否相当于 “const char*” 呢?
答案是否定的,原因很简单,typedef 是用来定义一种类型的新别名的,它不同于宏,不是简单的字符串替换(有关 typedef 和 #define 的区别,请猛击这里了解详情)。因此,“const PCHAR”中的 const 给予了整个指针本身常量性,也就是形成了常量指针“char*const(一个指向char的常量指针)”。即它实际上相当于“char*const”,而不是“const char*(指向常量 char 的指针)”。当然,要想让 const PCHAR 相当于 const char* 也很容易,如下面的代码所示:
typedef const char* PCHAR;
int strcmp(PCHAR, PCHAR);
其实,无论什么时候,只要为指针声明 typedef,那么就应该在最终的 typedef 名称中加一个 const,以使得该指针本身是常量。
还需要特别注意的是,虽然 typedef 并不真正影响对象的存储特性,但在语法上它还是一个存储类的关键字,就像 auto、extern、static 和 register 等关键字一样。因此,像下面这种声明方式是不可行的:
typedef static int INT_STATIC;
不可行的原因是不能声明多个存储类关键字,由于 typedef 已经占据了存储类关键字的位置,因此,在 typedef 声明中就不能够再使用 static 或任何其他存储类关键字了。当然,编译器也会报错,如在 VC++2010 中的报错信息为“无法指定多个存储类”。
#define 是 C 指令,用于为各种数据类型定义别名,与 typedef 类似,但是它们有以下几点不同:
- typedef 仅限于为类型定义符号名称,#define 不仅可以为类型定义别名,也能为数值定义别名,比如您可以定义 1 为 ONE。
- typedef 是由编译器执行解释的,#define 语句是由预编译器进行处理的。
typedef和def的区别 这里面说使用define进行类型定义也会出现连续赋值失败的问题