当前位置:首页 » 《休闲阅读》 » 正文

C++杂说——命名空间,输入与输出,缺省参数,make/makefile

11 人参与  2024年09月29日 08:41  分类 : 《休闲阅读》  评论

点击全文阅读


希望你开心,希望你健康,希望你幸福,希望你点赞!

最后的最后,关注喵,关注喵,关注喵,大大会看到更多有趣的博客哦!!!

喵喵喵,你对我真的很重要!


命名空间

命名空间编译默认查找顺序:

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

在软件开发过程中,随着项目规模的扩大,编译、链接等构建过程变得日益复杂。为了提高开发效率,自动化构建工具应运而生,其中makeMakefile是最经典且广泛使用的工具之一。本文将深入探讨make命令和Makefile文件的工作原理、基本语法以及它们如何帮助开发者实现高效的自动化构建。

一、什么是Make和Makefile?

Make 是一个控制程序自动编译和链接的实用工具,它根据Makefile文件中定义的规则来自动完成编译、链接等任务。Makefile是一个包含了构建项目所需指令和依赖关系的文件,它告诉make命令如何编译和链接程序。

二、Makefile的基本结构

一个基本的Makefile通常包含以下部分:

目标(Targets):需要构建的对象,如可执行文件或库文件。依赖(Dependencies):构建目标所需的其他文件,如源文件、头文件等。命令(Commands):用于生成目标文件的shell命令。

举个栗子

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指令告诉makeclean不是一个文件名,而是一个特殊的标签,无论是否存在名为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 的作用和意义在于自动化、简化并优化软件的编译和构建过程。它们通过定义明确的构建规则和依赖关系,提高了开发效率、可移植性和可维护性,是软件开发中不可或缺的工具。


希望你开心,希望你健康,希望你幸福,希望你点赞!

最后的最后,关注喵,关注喵,关注喵,大大会看到更多有趣的博客哦!!!

喵喵喵,你对我真的很重要!


点击全文阅读


本文链接:http://zhangshiyu.com/post/166018.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1