C++编译过程详讲

C++编译过程

什么事集成开发环境?(来自百度百科

集成开发环境IDE,Integrated Development Environment )是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器调试器和图形用户界面等工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套。所有具备这一特性的软件或者软件套(组)都可以叫集成开发环境。如微软的Visual Studio系列,Borland的[C++ Builder](https://baike.baidu.com/item/C%2B%2B Builder)、Delphi系列等。该程序可以独立运行,也可以和其它程序并用。IDE多被用于开发HTML应用软件。例如,许多人在设计网站时使用IDE(如HomeSiteDreamWeaver等),因为很多项任务会自动生成。

什么是 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

  1. 以#号开头的语句成为预处理命令
  2. #include不是必须的,但是如果一旦程序中有该语句,就必须把他放在程序的开始处!

iostream

  1. iostream文件中的内容添加到程序中
  2. iostream中包含了有关输入输出语句的函数

iostream

iuput & output

stream 流,这是一个抽象的概念

4.图表对照:头文件命名约定

头文件类型约定实例说明
C旧式风格以 .h 结尾stdio.h
math.h
C,C++通用
C++旧式风格以 .h 结尾iostream.hC++可以使用
C++新式风格没有扩展名iostreamC++可以使用,需要使用
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)

原理说明:

  1. 从概念上来讲,输出是一个流,可以理解成从程序流出一系列字符
  2. cout对象表示这种流,在iostream文件中定义
  3. 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.命令窗口常用快捷键

CMD链接

12.如何重命名多个文件夹?(文件)

  1. 新建文件夹
  2. Ctrl+C复制新建的文件夹
  3. Ctrl+V粘贴N个文件夹
  4. Ctrl+A全选文件
  5. 光标移动到某个文件夹上,右键打开重命名
  6. 回车结束

在这里插入图片描述
重命名多个文件从第4步骤开始即可!

老铁,加个关注吧!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值