C++编译过程
C++的开发工具
记事本 Notepad++ 使用命令行
Visual Studio
Visual C++ 6.0
code :: blocks
其他开发工具 Dev C++ ,Clion,Eclipse…
典型的HelloWorld程序
#include<iostream>
using namespace std;
int main(){
cout<<"HelloWorld"<<endl;
return 0;
}
解析HelloWorld程序
#include
- 以#号开头的语句成为预处理命令
- #include不是必须的,但是如果一旦程序中有该语句,就必须把他放在程序的开始处!
iostream
- 将iostream文件中的内容添加到程序中
- iostream中包含了有关输入输出语句的函数
iostream
iuput & output
stream 流,这是一个抽象的概念
图表对照:头文件命名约定
头文件类型 | 约定 | 实例 | 说明 |
---|---|---|---|
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右边<<符号是插入运算符,可以将右侧信息插入到流中
关于编码规范
C++编码风格
每条语句各占一方
每个函数都有一个开始和和结束的花括号{},花括号成对出现
函数中的语句对应花括号缩进
与函数名称相关的小括号周围没有空格
书写注释是一个良好的编程习惯
有助于对代码的阅读
注释应该准确,简洁,易懂
// 这是单行注释
/*
这是多行注释
*/
//这是文档注释:
/*******************************
*时间:
*作者:
*版本:
*/
C++的执行和编译
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:😉
推荐博客链接:https://www.cnblogs.com/mickole/articles/3659112.html
运行练习:
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
结果:
你不知道的事:
-
[MinGW](javascript:😉 编译器;工具链;安装
-
Characteristics:是一个标志的集合,其中大部分的位用在目标文件(OBJ)或库文件 (LIB)中: Bit 0 (IMAGE_FILE_RELOCS_STRIPPED):置1表示文件中没有重定向信息。每个段都 有它们自己的重定向信息。
-
… /bin 使用者可执行的 binary file 的目录 /lib 系统会使用到的函数库 /lib 系统会使用到的函数库 …
-
计算机是用数字电路搭成的,数字电路中只有1和0两种状态,或者可以说计算机只有两个手指,所以对计算机来说二进制(Binary)是最自然的计数方式。根据“逢二进一”的原则,十进制的1、2、3、4分别对应二进制的1、10、11、100。
-
一、简介:
gcc 最初是 “GNU C Compiler” 的简称,只是当作一个 C 语言的编译器,现在已经变成了 “GNU Compiler Collection”,可以编译多种语言。二、编译的四个阶段:
在使用 gcc 编译程序时,编译过程可以被细分为 4 个阶段:◆ 预处理(Pre-Processing)
◆ 编译(Compiling)
◆ 汇编(Assembling)
◆ 链接(Linking)
-
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:调试器