1. C++ 项目结构
C++ 项目包含几千个文件,当构建项目时,需要选择编译哪些文件,选择哪种工具编译这些文件组织称可执行文件
1.1 编译
计算机处理器只能执行底层二进制指令,编译器需要将C++源码转换成处理器能执行的指令集。
- 编译器配置的内存称为栈帧(Stack frame),配置内存传递数据
- 函数接收参数并返回一个值
- 函数声明只在函数内部使用的变量,并且将只有在函数被调用时才存在
- 代码错误,向用户提示错误信息
1.2 链接代码
编译器将一个或多个C++源码文件编译成对象文件。然后通过连接器将对象文件链接到一个可执行程序中
1. 3 源代码
以
.cpp
结尾的文本文件称为源代码文件
#include <iostream>
// 程序入口
int main() {
// << 运算符号将 字符串 "Helle World!\n" 添加到流对象 std::cout 中
// cout对象是在std名称空间下声明的
// cout对象是iostream类的一个实例,并在main函数调用前已经创建
// << 表示名为 << 的函数被调用,该函数会将字符串中的每个字符打印到控制台上,直到遇到第一个NULL字符
std::cout << "Hello World!\n";
}
- 注释:以
//
开头的行,编译器会自动忽略到行尾的所有文本,多行注释以/* */
包裹 - 大括号:
{}
代码快 - 函数:声明了返回值类型,具有一对圆括号的函数名,圆括号中声明了传递给函数的参数
- 约定main函数是程序的入口,是项目代码中首先被调用的函数。若main函数没有返回值,默认返回 0
- 语句以分号结尾
- 字符串使用
双引号
括起来 - std是命名空间,表示类似目录代码的集合
- 双冒号
::
是域解析运算符 - 运算符重载:对运算符默认行为进行重新定义
#
向编译器声明某种类型信息#include
将文件中的内容拷贝到该源代码文件中,这种特定文件称为头文件,适用于通过库复用代码#define
#pragma
是标准库的一部分,在C++编译器附带的include目录下找到,使用 <>
表明编译器应该用存储在头文件的标准目录中找相关内容,使用双引号""
自定义头文件的绝对或者相对路径,头文件的命名以.h结尾
1.4 解析命令行参数
通过命令行向可执行文件传递参数
#include <iostream>
// 命令行参数以空格隔开,参数第一个为命令程序本身,所有接收到的参数都是字符串类型,若是想要获取一个字符串参数,则需要对字符串进行类型转换
int main(int argc, char *argv[]) {
// 终端输出传入命令行的参数个数
std::cout << "number of arguments is: " << argc << std::endl;
// 通过for循环打印出每个参数的值
for (int i = 0; i < argc; i++) {
std::cout << argv[i] << std::endl;
}
}
# 编译
c++ src/main.cpp -o main
# 运行
./main 1 2 3 4 5
# 输出:
number of arguments is: 6
./main
1
2
3
4
5
- 接收命令行传递过来的参数,main函数包含两个参数
- 第一个参数 argc,是整数,指定传递过来的参数数量
- 第二个参数 argv,是一个指向内存中C字符串的指针数组
[]
表示一个数组,并且数组中每个元素的类型是char *
,*
表示数组的每个元素都是指向内存的指针,char *
表示指向内存中以NUL
字符结尾0个或多个字符,字符串的长度由到NUL
字符串的字符总数得出std::endl
: 代替换行符添加新的一行,然后对输入流的内容刷新- 数组索引从0开始,通过
[i]
方式访问,数组的长度为元素数量n,数组最后一个元素的索引为 n-1