C 并没有太陌生,只是 win C 还是让我感觉有点陌生的。

课堂笔记

C语言

优势

  1. 语法简洁,比低级语言更抽象级别更高。
  2. 可移植性强,跨平台能力较好。
  3. 用途广泛,Linux和Windows的内核均是 C 语言编写的。
  4. 可操作性强,通过指针可以任意操控内存。

C语言生成可执行文件的过程

源文件(.c)→目标文件(.obj)→通过链接器链接启动代码和库→可执行文件(.exe)

链接分静态链接和动态链接,静态链接会把库的代码一并写入可执行文件当中,而动态链接依赖于 runtime(运行时),也就是 dll。

VS的使用

VS2022在创建项目的时候并不能选择,可以先按照模板创建好之后,项目→属性→C/C++→预编译头中取消预编译头文件,然后删除它给的 pch.cpp,删除里面的所有代码,只留一个 main.cpp 即可。

在属性设置中,可以使用 Release/Debug 选择 发行/调试版,发行版一般优化更多,调试版一般会包含调试信息,方便调试。

在 项目→属性→C/C++→代码生成 当中的选项,运行库选择 MDd 表示动态链接,MTd 表示静态链接。

main函数并非第一个执行的函数,首先执行的是启动代码,只不过启动代码默认首先调用 main 函数,在 VS 当中可以修改入口点让我们的启动函数非 main 函数。

头文件(.h),声明函数的用法,实际实现已经在库或者是 cpp 当中了,我们实际调用代码的时候只需要 include 对应的头文件即可。

写一个 add 函数,创建好声明和定义。

最后再在 main 函数中包含 add.h 即可调用代码。

在 include 自己写的文件时,需用双引号包裹而不是尖括号,尖括号只会从系统头文件中寻找而不会从自己写的头文件中寻找。

在监视窗口中,添加 err,hr 可以监视错误,获取错误码,获取到的错误码可以通过 菜单栏中的工具→错误查找 中查询对应的报错信息。

课后作业

什么是可移植性?

可移植性自认为就是将代码运行从一个平台到另一个平台的难易程度吧,越简单则可移植性越强。

编译器是做什么的?

编译器是用于编译源代码的,将高级语言翻译成低级语言的程序。

链接器是做什么的?

感觉作用应该是合并两个文件的代码块?在Linux C中应该是为可执行文件添加全局地址和提供库连接的方案使用的。

什么是语法错误?

不符合语法规则的源代码书写,语法错误会直接导致编译无法进行。

什么是语义错误?

可以编译可以运行,但是可能会导致运行结果不正确,一般这个好像叫逻辑错误。

编写程序打印信息:

1
2
3
4
5
6
#include<stdio.h>
#include "add.h"
int main()
{
printf("%s\n%d\n%s", "xia0ji233", 20, "1399999999");
}

编写一个函数实现上述功能,并在主函数调用:

1
2
3
4
5
6
7
8
9
10
#include<stdio.h>
#include "add.h"
void print()
{
printf("%s\n%d\n%s", "xia0ji233", 20, "1399999999");
}
int main()
{
print();
}

四种运行库编译选项的区别?

感觉就是静态调试,静态非调试,动态调试,动态非调试。。