C语言基础-解答读effective C++产生的问题

目录

问题1: 关于C++的命名空间和C语言的标准库

问题2:C语言的内存管理-堆和栈和它们的优缺点、内存管理的算法

问题3: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语言静态库和动态库的使用

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进行类型定义也会出现连续赋值失败的问题

猜你喜欢

转载自blog.csdn.net/weixin_42914662/article/details/126203194
今日推荐