C++编译过程
什么事集成开发环境?(来自百度百科)
集成开发环境(IDE,Integrated Development Environment )是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套。所有具备这一特性的软件或者软件套(组)都可以叫集成开发环境。如微软的Visual Studio系列,Borland的[C++ Builder](https://baike.baidu.com/item/C%2B%2B Builder)、Delphi系列等。该程序可以独立运行,也可以和其它程序并用。IDE多被用于开发HTML应用软件。例如,许多人在设计网站时使用IDE(如HomeSite、DreamWeaver等),因为很多项任务会自动生成。
什么是 g++?
gcc and g++分别是GNU的c & c++编译器。gcc/g++在执行编译的时候一般有下面4步:
⒈预处理,生成.i的文件[预处理器cpp]。
⒉将预处理后的文件转换成汇编语言,生成文件.s[编译器egcs]。
⒊由汇编变为目标代码(机器代码)生成.o的文件[汇编器as]。
⒋连接目标代码,生成可执行程序[链接器ld]。
什么是字符集?
字符(Character)是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。字符集(Character set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集名称:ASCII字符集、GB2312字符集、BIG5字符集、 GB18030字符集、Unicode字符集等。计算机要准确的处理各种字符集文字,就需要进行字符编码,以便计算机能够识别和存储各种文字。中文文字数目大,而且还分为简体中文和繁体中文两种不同书写规则的文字,而计算机最初是按英语单字节字符设计的,因此,对中文字符进行编码,是中文信息交流的技术基础。
1.C++的开发工具
记事本 Notepad++ 使用命令行
Visual Studio
Visual C++ 6.0
code :: blocks
其他开发工具 Dev C++ ,Clion,Eclipse…
2.典型的HelloWorld程序
#include<iostream>
using namespace std;
int main(){
cout<<"HelloWorld"<<endl;
return 0;
}
解析:
#include<iostream> //预处理 input() output() stream 流
// #include<stdio.h> // C语言头文件 std io .head
using namespace std;
// using namespace--> 告诉编译器使用 std 命名空间。命名空间是 C++ 中一个相对新的概念。
// std 标准库 standard(标准的)
int main(){
cout<<"HelloWorld"<<endl; //printf("");
// cin>>a; //scanf("");
int a,b,c;
cout<<"Please input a,b,c:"<<endl;
//endl; end+line => 结束当前行(清空缓存); \n 单纯的换行操作
// cin>>a>>b>>c;
cin>>a
>>b
>>c;
// cout<<a<<b<<c<<endl;
cout<<a
<<b
<<c
<<endl;
return 0; //关闭主函数
}
3.解析HelloWorld程序
#include
- 以#号开头的语句成为预处理命令
- #include不是必须的,但是如果一旦程序中有该语句,就必须把他放在程序的开始处!
iostream
- 将iostream文件中的内容添加到程序中
- iostream中包含了有关输入输出语句的函数
iostream
iuput & output
stream 流,这是一个抽象的概念
4.图表对照:头文件命名约定
头文件类型 | 约定 | 实例 | 说明 |
---|---|---|---|
C旧式风格 | 以 .h 结尾 | stdio.h math.h | C,C++通用 |
C++旧式风格 | 以 .h 结尾 | iostream.h | C++可以使用 |
C++新式风格 | 没有扩展名 | iostream | C++可以使用,需要使用 using namespace |
转换后的C | 加上前缀c 没有扩展名 | cmath ctype等 | C++使用 |
using namespace std;
使用名称空间 std --> [standard](javascript:😉
名称空间是一项C++的特性,用来编写大型程序时组织源代码;
其他用法:
using std::cout;
using std::cin;
using std::endl;
说明:
<< 符号表示把内容发送给 cout 打印
endl 是控制符,表示重启一行(\n) --> end line ;
endl 与 \n的区别:\n只是表示单纯的换行操作,endl 表示:1 换行 2清空缓存 fflush(stdin)
原理说明:
- 从概念上来讲,输出是一个流,可以理解成从程序流出一系列字符
- cout对象表示这种流,在iostream文件中定义
- cout右边<<符号是插入运算符,可以将右侧信息插入到流中
5.关于编码规范
C++编码风格
- 每条语句各占一行
- 每个函数都有一个开始和和结束的花括号{ },花括号成对出现
- 函数中的语句对应花括号缩进
- 与函数名称相关的小括号周围没有空格
书写注释是一个良好的编程习惯
有助于对代码的阅读
注释应该准确,简洁,易懂
// 这是单行注释
/*
这是多行注释
*/
//这是文档注释:
/*******************************
*时间:2020年**月**日
*作者:***
*版本:Dev C++ -5.4.0
******************************/
6.C++的执行和编译
打开画图工具:windows+R 打开命令提示窗口,输入mspaint
1) 预处理
将.c 文件转化成 .i文件
使用的gcc命令是:gcc –E
对应于预处理命令cpp
2) 编译
将.c/.h文件转换成.s文件
使用的gcc命令是:gcc –S
对应于编译命令 cc –S
3) 汇编
将.s 文件转化成 .o文件
使用的gcc 命令是:gcc –c
对应于汇编命令是 as
4) 链接
将.o文件转化成可执行程序
使用的gcc 命令是: gcc
对应于链接命令是 ld
总结起来编译过程就上面的四个过程:
预编译处理(.c)
编译、优化程序(.s、.asm)
汇编程序(.obj、.o、.a、.ko)
链接程序(.exe、.elf、.axf等)。
命令提示符
windows+R 打开窗口,输入 cmd
[command](javascript:😉
运行练习:
Microsoft Windows [版本 10.0.18363.720]
(c) 2019 Microsoft Corporation。保留所有权利。
F:\我的程序人生\CSDN博客>gcc -o HelloWorld.ii -E HelloWorld.cpp
'gcc' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
F:\我的程序人生\CSDN博客>gcc -v
'gcc' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
F:\我的程序人生\CSDN博客>g++ -v
'g++' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
F:\我的程序人生\CSDN博客>
Microsoft Windows [版本 10.0.18363.720]
(c) 2019 Microsoft Corporation。保留所有权利。
F:\我的程序人生\CSDN博客\C++编译过程>g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=E:/codeblocks/MinGW/bin/../libexec/gcc/mingw32/4.9.2/lto-wrapper.exe
Target: mingw32
Configured with: ../../../src/gcc-4.9.2/configure --build=mingw32 --enable-languages=ada,c,c++,fortran,lto,objc,obj-c++ --enable-libgomp --enable-lto --enable-graphite --enable-libstdcxx-debug --enable-threads=posix --enable-version-specific-runtime-libs --enable-fully-dynamic-string --enable-libstdcxx-threads --enable-libstdcxx-time --with-gnu-ld --disable-werror --disable-nls --disable-win32-registry --disable-symvers --enable-cxx-flags='-fno-function-sections -fno-data-sections -DWINPTHREAD_STATIC' --prefix=/mingw32tdm --with-local-prefix=/mingw32tdm --with-pkgversion=tdm-1 --enable-sjlj-exceptions --with-bugurl=http://tdm-gcc.tdragon.net/bugs
Thread model: posix
gcc version 4.9.2 (tdm-1)
F:\我的程序人生\CSDN博客\C++编译过程>g++ -o HelloWorld.ii -E HelloWorld.cpp
F:\我的程序人生\CSDN博客\C++编译过程>g++ -o HelloWorld.s -S HelloWorld.ii
F:\我的程序人生\CSDN博客\C++编译过程>g++ -o HelloWorld.o -c HelloWorld.s
F:\我的程序人生\CSDN博客\C++编译过程>g++ -o HelloWorld.exe HelloWorld.o
F:\我的程序人生\CSDN博客\C++编译过程>HelloWorld
TestHelloWorld
F:\我的程序人生\CSDN博客\C++编译过程>exit
结果:
7.在 C++ 中 main 函数前面为什么要加上数据类型,比如: int void ?
main 函数的返回值是返回给主调进程,使主调进程得知被调用程序的运行结果。
标准规范中规定 main 函数的返回值为 int,一般约定返回 0 值时代表程序运行无错误,其它值均为错误号,但该约定并非强制。
如果程序的运行结果不需要返回给主调进程,或程序开发人员确认该状态并不重要,比如所有出错信息均在程序中有明确提示的情况下,可以不写 main 函数的返回值。在一些检查不是很严格的编译器中,比如 VC, VS 等,void 类型的 main 是允许的。不过在一些检查严格的编译器下,比如 g++, 则要求 main 函数的返回值必须为 int 型。
所以在编程时,区分程序运行结果并以 int 型返回,是一个良好的编程习惯。
8.C 语言 int main() 和 int main(void) 的区别?
int main(void) 指的是此函数的参数为空,不能传入参数,如果你传入参数,就会出错。
int main() 表示可以传入参数。
// 这样是正确的
int main()
{
if (0) main(42);
}
// 这样会出错
int main(void)
{
if (0) main(42);
}
在 C++ 中 int main() 和 int main(void) 是等效的,但在 C 中让括号空着代表编译器对是否接受参数保持沉默。在 C 语言中 main() 省略返回类型也就相当说明返回类型为 int 型,不过这种用法在 C++ 中逐渐被淘汰。虽然 void main()在很多系统都适用,但他毕竟不是标准的,所以应该避免这种用法, 应该使用这种 int main(void) 的写法比较妥当。
9.为什么要使用 using namespace std; ?
有些名字容易冲突,所以会使用命名空间的方式进行区分,具体来说就是加个前缀。比如 C++ 标准库里面定义了 vector 容器,你自己也写了个 vector 类,这样名字就冲突了。于是标准库里的名字都加上 std:: 的前缀,你必须用 std::vector 来引用。同理,你自己的类也可以加个自定义的前缀。
但是经常写全名会很繁琐,所以在没有冲突的情况下你可以偷懒,写一句 using namespace std;,接下去的代码就可以不用写前缀直接写 vector 了。
10.你不知道的事
-
[MinGW](javascript:😉 编译器;工具链;安装
-
… /bin 使用者可执行的 binary file 的目录 /lib 系统会使用到的函数库 /lib 系统会使用到的函数库 …
-
计算机是用数字电路搭成的,数字电路中只有1和0两种状态,所以对计算机来说二进制(Binary)是最自然的计数方式。
-
gcc与g++的区别:
1) 都可以用于编译.c或.cpp文件; 2) gcc将.c文件当成C程序,g++将.c文件当成C++程序; 3) g++的语法检测更严格一些; 4) 对于cpp文件,gcc与g++在编译阶段是等价的,g++会调用gcc; 5) 链接由g++完成,由两种方式:g++ 或 gcc -lstdc++
-
gdb:调试器
11.命令窗口常用快捷键
12.如何重命名多个文件夹?(文件)
- 新建文件夹
- Ctrl+C复制新建的文件夹
- Ctrl+V粘贴N个文件夹
- Ctrl+A全选文件
- 光标移动到某个文件夹上,右键打开重命名
- 回车结束
重命名多个文件从第4步骤开始即可!
老铁,加个关注吧!