入门Visual Studio使用小结
23年一月
++Windows C++平台为Visualstdio
MacC++平台为Xcode
LinuxC++平台为CodeLite编译器
观察VisualStdio的报错信息就看OutPut窗口(输出窗口),不要看errorList错误清单。
编译器会为每一个source(源)文件生成一个obj文件
链接器会将所有obj文件合并成一个.exe文件
在编译时,每一个cpp文件被称作一个翻译单元,c++并不关心这些cpp文件,
所以这就是和Java不同的地方,文件名不需要和类名一样,文件夹层次需要和package层次一样。编译器只会认为.cpp是将用C++的方式来处理和翻译链接这种类型的文件.C和.H文件也一样。文件对编译器是没有任何特殊意义的。
每一个翻译单元会生成一个.obj文件,如果一个cpp文件包含了其他的cpp文件,变成一个大的cpp文件那么编译器只会将这个半酣了很多cpp文件的大cpp文件当成一个翻译单元,生成一个obj文件。这就是cpp文件和翻译单元的差别
一个cpp文件并不一定等价于一个翻译单元,只包含几行代码的obj文件之所以有30~40kb的存储,是因为包含了iostream这个预处理文件(preview process file)
#include指定了一个你想要的文件,编译器将读取这个文件,然后将它里面的内容粘贴到目标文件当中,即pbj文件当中。
下面这个例子就是证明了#inlcude文件被粘贴到目标文件当中,编译成功:
EndBrace中写了一个},Math缺少一个},结果编译成功
这将让我们知道如何更好的使用头文件(head file)
#if预处理语句可以让我们包含和排除基于给定条件的代码:
语法格式:
#if 0或1
code
#endif
Iostream中包含了大量的代码,以上就是预处理器的进行的过程
接着代码会开始将代码翻译成二进制机器代码
Obj文件中的是二进制代码:
而在属性中将输出文件的汇编文件输出改为带有程序集的输出之后,我们可以看得到将cpp文件翻译成汇编语言的asm文件:
编译器工作原理·:
编译器将获取源文件并输出一个obj文件,obj文件是包含及其代码的文件,以及我们定义的常数数据,可执行文件是包含了所有需要运行的机器代码文件
第一个阶段是编译源文件:
先编译后链接
Build文件不会进入链接这个步骤,只是对build的这个文件产生obj文件
代码的语法错误是在编译阶段产生的错误,错误代码以C开头。
链接错误的错误代码是以LNK开头的’
.exe文件必须具有某种入口
而我们通常使用默认的main函数作为程序的入口点,而我们也能够自定义程序入口点(entry point)在链接器中的advance中设置自定义entry point
编译阶段只要有函数声明就不会报错
链接阶段是在寻找调用函数的过程
Static静态声明函数之后,说明函数或者变量只会在当前这个翻译单元被用到,所以此时只要不调用此时函数不真实存在的函数声明时,一样能够build successful
当在函数或者变量之前加上static修饰符之后,说明被修饰的变量或者函数只能在Interna内使用,不会被链接器链接到其他文件
所以static修饰符常被用在head file中,以避免多次#include head file出现链接时多次重复定义的链接错误
Inline关键字的作用是将获取我们实际的函数体并将函数调用替换为函数体。
也就是在函数调用的地方直接展开函数体function body
int是四字节的表示范围即32位bit,其中31位用来表示数字,剩下一位从来表示符号。
而unsigned int可以将全部的32位数字全都用来表示数字,省去表示符号的一位数字。
Char是表示一个字节
断点和调试
Step into Fn+F11 进入函数
Step overFn+F10 从当前函数跳到下一行代码
Step out Fn+Shift +F11 跳出当前函数,回到调用函数的位置
查看代码disassembly视图,帮助我们查看我们代码的反汇编程序disassembly program
If语句
If和switch分支语句会导致程序慢下来,如果我们追求快速高效率的程序,我们应当尽量避免使用这种语句,==这个操作符能够比较两个数是否相等是因为==在C++的标准库中被定义的这样的应用方式,具体为系统将两个数所在内存的位置比较每一个字节内存单元内的数是否相等。
If语句只会关注()内的值是否为0.,unllptr
Else if其实不是一个基本的语句,而是通过else和if语句组合使用而产生的简化语句
Else if等价于:
Else
{
If
{
}
}
Else if不是C++的关键字组合
创建一个较为标准且合适的C++完整项目:
这些头文件合着是源文件叫做Filter过滤器(筛选器)文件而不是一个真正的file文件夹,这些事虚拟文件,在磁盘上并不真实存在。
将项目文件类似于源文件和文件与其他文件分开,并存在一个其他的文件夹,以便更好的划分和管理这些文件:
点击show all files 显示所有文件,此时再次右键项目时,能够看到可以创建一个真实存在于磁盘的文夹:
此时创建一个名为src的新项目,在vs中将它拖至src文件夹目录下,可以在文件管理器看到此时src.cpp已经属于src文件夹的目录下了:
每次我们进入vs时的默认解决方案视图都是筛选器视图,这个视图只是一种虚拟的管理方案,与实际项目并无联系
当我们想要将我们的项目变得更容易管理时,我们还能够对输出目录和中间目录的存放位置进行路径的修改:
上例中我们将中间目录和输出目录都存放在了SolutionDir中新建的bin目录中,二进制文件中,二中间目录则另外新建了一个immediates的中间文件存放文件,这样使得我们能够将多个项目的.exe文件一起存放在这一个文件下管理。
经过上述两个项目的配置过后,项目变得更加整洁易于管理。
循环—for循环和while循环、do-while 循环
For(int I = 0;i<10;i++)
{
}
While(condition)
{
}
Do
{
}while();
这里注意语法,只有do while语句是需要在最后加上分号的。
适用于所有循环语句的控制语句:
Continue语句的作用是跳出当前的这次循环,进而进入此语句的下一次循环继续运行;
Break语句的作用是结束当前语句循环,跳出语句,执行语句后面的代码
Return语句的作用是退出当前函数