希望你开心,希望你健康,希望你幸福,希望你点赞!
最后的最后,关注喵,关注喵,关注喵,大大会看到更多有趣的博客哦!!!
喵喵喵,你对我真的很重要!
命名空间
命名空间编译默认查找顺序:
a、当前局部域 : 自留地
b、全局域找 : 村子野地
c, 不会到其他命名空间中去找 : 隔壁张大爷自留地
命名空间展开三种
1、指定访问
2、全展开
展开命名空间
//using namespace bit;
//using namespace xjh;
3、指定展开某一个(经常使用,可以展开它一个)
// 指定展开某一个
//using bit::x;
命名空间可以为:
// 局部域
// 全局域
// 命名空间域
// 不同域可以定义同名的变量/函数/类型
两个私有的命名空间最好不要同时展开,如果命名相同,会直接命名冲突报错。
一个私有的命名空间和全局域命名空间同时展开(两个命名空间展开了),不会命名冲突报错,会按照命名空间编译默认查找顺序进行查找。
不同文件命名了同一个命名空间,这两个命名空间会合并成同一个命名空间。
输入与输出
//// << 流插入//int i = 0;//double j = 1.11;////// 自动识别类型//std::cout << i << " " << j << '\n' << std::endl;//std::cout << i << " " << j << '\n' << std::endl;
缺省参数
有全缺省和半缺省(从右往左缺省),讲究了一个顺序。必须顺序传,不能跳跃着传。
F2(1, 2, 3);
F2(1, 2);
F2(1);
F2();
缺省参数不能声明和定义同时给,一般给声明(作为默认值,没有定义就用它)。指导扩容,建议销售价格。
Make/Makefile
在软件开发过程中,随着项目规模的扩大,编译、链接等构建过程变得日益复杂。为了提高开发效率,自动化构建工具应运而生,其中make
和Makefile
是最经典且广泛使用的工具之一。本文将深入探讨make
命令和Makefile
文件的工作原理、基本语法以及它们如何帮助开发者实现高效的自动化构建。
一、什么是Make和Makefile?
Make 是一个控制程序自动编译和链接的实用工具,它根据Makefile
文件中定义的规则来自动完成编译、链接等任务。Makefile
是一个包含了构建项目所需指令和依赖关系的文件,它告诉make
命令如何编译和链接程序。
二、Makefile的基本结构
一个基本的Makefile
通常包含以下部分:
举个栗子
gr:gr.c gcc -o $@ $^.PHONY:cleanclean: rm -f myprocess
gr:gr.c
这一行定义了一个规则(rule),它的目标是gr
(通常是一个可执行文件的名称)。这个规则依赖于gr.c
文件,意味着如果gr.c
文件被修改,那么gr
目标就需要被重新构建。在这个上下文中,gr
是目标(target),而gr.c
是依赖(dependency)。
gcc -o $@ $^
这是与上一行规则相关联的命令(command)。当make
决定需要构建gr
目标时,它会执行这条命令。这里使用了gcc
编译器来编译gr.c
文件。
-o $@
:-o
选项后面跟的是输出文件的名称,$@
是一个自动变量,代表当前规则中的目标文件名,即gr
。$^
:这是一个自动变量,代表当前规则中所有的依赖文件名,在这个例子中就是gr.c
。因此,这条命令的意思是使用
gcc
编译器编译gr.c
文件,并将生成的可执行文件命名为gr
。 .PHONY: clean
这一行声明了一个伪目标(phony target)clean
。伪目标并不是真正的文件名,而是一个标签,用于执行特定的操作,如清理构建过程中生成的文件。.PHONY
指令告诉make
,clean
不是一个文件名,而是一个特殊的标签,无论是否存在名为clean
的文件,make clean
命令都会执行其下的命令。
clean:
这是clean
伪目标的定义行,它本身不包含任何依赖,因为伪目标通常不依赖于任何文件。
rm -f myprocess
这是与clean
伪目标相关联的命令。当执行make clean
时,这条命令会被执行。rm -f
命令用于删除文件,-f
选项表示如果文件不存在,则不报错。myprocess
通常是在构建过程中生成的可执行文件或其他需要清理的文件。然而,这里有一个潜在的错误或不一致之处,因为前面的规则是构建gr
而不是myprocess
。如果意图是清理gr
,则应该使用rm -f gr
。
其中命令
GCC
GCC(GNU Compiler Collection)是GNU推出的基于C/C++的编译器,也是开放源代码领域应用最广泛的编译器之一。它提供了丰富的命令和选项,以满足不同的编译需求。以下是一些常用的GCC命令和选项:
基本编译命令
无选项编译链接: 命令:gcc test.c
功能:默认生成名为a.out
的可执行程序。指定输出文件名: 命令:gcc -o test test.c
功能:生成名为test
的可执行程序,而不是默认的a.out
。 编译过程控制
预处理: 命令:gcc -E test.c
功能:仅执行预处理操作,生成预处理后的文件(如test.i
),不进行编译、汇编和链接。编译到汇编代码: 命令:gcc -S test.c
功能:将C代码编译成汇编代码,生成汇编文件(如test.s
),不进行汇编和链接。汇编并生成目标文件: 命令:gcc -c test.c
功能:将C代码编译并汇编成目标文件(如test.o
),不进行链接。链接: 命令:gcc test.o -o test
功能:将目标文件(如test.o
)与库文件链接,生成可执行文件(如test
)。 调试选项
-g
:在编译时加入调试信息,使得生成的可执行文件可以用GDB等工具进行调试。 链接库
-llibrary
:链接指定的库。例如,gcc -lpthread test.c
会链接pthread库。-Ldir
:指定搜索库的路径。例如,gcc -L/usr/local/lib -lpthread test.c
会在/usr/local/lib
目录下搜索pthread库。 其他常用选项
-Wall
:生成所有警告信息,帮助开发者发现潜在的错误。-w
:不生成任何警告信息。-pipe
:使用管道代替编译中的临时文件,可以提高编译速度。-Idir
:指定头文件的搜索路径。例如,gcc -I/usr/include/mylib test.c
会在/usr/include/mylib
目录下搜索头文件。-E -C
:在预处理时保留注释信息,通常与-E
一起使用。-M
, -MM
, -MD
, -MMD
:生成文件依赖信息,帮助管理项目中的文件依赖关系。 make
和 Makefile
在软件开发中扮演着至关重要的角色,特别是在编译和构建大型项目时。它们的作用和意义主要体现在以下几个方面:
1. 自动化编译过程
make
工具通过读取 Makefile
文件中定义的规则,自动化地执行编译、链接等构建过程。这避免了手动执行一系列复杂命令的需要,提高了开发效率。开发者只需在终端中输入 make
命令,make
就会根据 Makefile
中的规则自动完成构建过程。
2. 管理项目依赖
Makefile
允许开发者定义项目中的文件依赖关系。当某个源文件被修改时,make
能够识别出哪些目标文件(如对象文件或可执行文件)需要重新构建,从而只编译和链接那些受影响的文件,而不是整个项目。这种增量构建的方式大大减少了构建时间。
3. 提高可移植性和可维护性
通过 Makefile
,开发者可以定义不同平台或不同环境下的编译选项和构建规则。这样,无论项目被部署到哪个环境,都可以通过修改 Makefile
来适应不同的编译和链接需求,提高了项目的可移植性。同时,Makefile
的清晰结构和明确的规则也提高了项目的可维护性。
4. 支持并行构建
make
工具支持并行构建,即同时编译多个源文件。这可以显著减少大型项目的构建时间。make
会自动检测系统中的处理器数量和可用资源,并尽可能并行地执行编译任务。
5. 简化清理工作
Makefile
中通常还会定义清理规则(如 clean
目标),用于删除构建过程中生成的所有文件(如对象文件、可执行文件等)。这简化了项目的清理工作,使得开发者可以轻松地恢复到构建前的状态。
6. 支持复杂的构建逻辑
Makefile
提供了丰富的语法和功能,支持条件判断、循环、函数调用等复杂的构建逻辑。这使得开发者能够编写出高度定制化的构建脚本,以满足各种复杂的构建需求。
总结
make
和 Makefile
的作用和意义在于自动化、简化并优化软件的编译和构建过程。它们通过定义明确的构建规则和依赖关系,提高了开发效率、可移植性和可维护性,是软件开发中不可或缺的工具。
希望你开心,希望你健康,希望你幸福,希望你点赞!
最后的最后,关注喵,关注喵,关注喵,大大会看到更多有趣的博客哦!!!
喵喵喵,你对我真的很重要!