C++杂说——命名空间,输入与输出,缺省参数,make/makefile
CSDN 2024-10-04 17:35:01 阅读 65
希望你开心,希望你健康,希望你幸福,希望你点赞!
最后的最后,关注喵,关注喵,关注喵,大大会看到更多有趣的博客哦!!!
喵喵喵,你对我真的很重要!
命名空间
命名空间编译默认查找顺序:
a、当前局部域 : 自留地
b、全局域找 : 村子野地
c, 不会到其他命名空间中去找 : 隔壁张大爷自留地
命名空间展开三种
1、指定访问
2、全展开
展开命名空间
//using namespace bit;
//using namespace xjh;
3、指定展开某一个(经常使用,可以展开它一个)
// 指定展开某一个
//using bit::x;
命名空间可以为:
// 局部域
// 全局域
// 命名空间域
// 不同域可以定义同名的变量/函数/类型
两个私有的命名空间最好不要同时展开,如果命名相同,会直接命名冲突报错。
一个私有的命名空间和全局域命名空间同时展开(两个命名空间展开了),不会命名冲突报错,会按照命名空间编译默认查找顺序进行查找。
不同文件命名了同一个命名空间,这两个命名空间会合并成同一个命名空间。
输入与输出
<code>//// << 流插入
//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
通常包含以下部分:
目标(Targets):需要构建的对象,如可执行文件或库文件。依赖(Dependencies):构建目标所需的其他文件,如源文件、头文件等。命令(Commands):用于生成目标文件的shell命令。
举个栗子
gr:gr.c
gcc -o $@ $^
.PHONY:clean
clean:
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
的作用和意义在于自动化、简化并优化软件的编译和构建过程。它们通过定义明确的构建规则和依赖关系,提高了开发效率、可移植性和可维护性,是软件开发中不可或缺的工具。
希望你开心,希望你健康,希望你幸福,希望你点赞!
最后的最后,关注喵,关注喵,关注喵,大大会看到更多有趣的博客哦!!!
喵喵喵,你对我真的很重要!
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。