C++里面头文件和源文件都要怎么编写以及运行

** 作为一个资深菜鸟,最近在看那本c++primer时对前面的书店程序难免有点兴趣,便打开vs2017想用宇宙第一IDE装下b,结果是一大堆问题,搞得我不知所措。
首先打开vs,创建新项目时,就之前我老是要创建空项目,后来发现原来好多老鸟都是创建win32 console application来创建项目,好吧我就跟着他们来,虽然我不知他们都有什么区别,但是我们还是先按着来。但是后来发现vs2017竟然找不到win32控制台,没有办法我只能创建个windows桌面导向先,然后其他选项选空项目,然后命名项目名称和路径,点击finish。
然后、看左边工程结构,我们可以看到项目文件下面有四个选线,分别为外部依赖文件(External Dependencles):这个目录是vs自动生成的啦。
还有header Files,source Files和Resource Files(这个资源文件如果你创建MFC文件就会在这里)。当然工程文件只是为了方便管理,与真实的目录不一定相同,可以按f2进行重命名自定义配置。你可以打开真实目录下可发现头文件和源文件是放在同一个文件夹下面。(顺便提一下绝对路径通常有相同的开头,相对路径是相对于当前的工作目录。例如cd~和cd-分别是回到主目录和回到上一级目录,ls -a #列出你所在目录的所有东西。)
好啦下一步就是在源程序中右键添加新建项,点击cpp文件然后命名,编写第一个c++程序,至于存在头文件#include“stdafx.h”无法识别的原因大多数是因为vs2107早已经将该头文件作为与预编译头,所以不用写出来。
下面还有一个自己比教困惑的地方,粘贴一下别人的想法吧。
首先,这个_tmain()是为了支持unicode所使用的main一个别名而已,既然是别名,应该有宏定义过的,在哪里定义的呢?就在那个让你困惑的<stdafx.h>里,有这么两行

#include <stdio.h>
#include <tchar.h>

我们可以在头文件<tchar.h>里找到_tmain的宏定义

#define _tmain main

所以,经过预编译以后, _tmain就变成main了,这下明白了吧
main()是标准C++的函数入口。标准C++的程序入口点函数,默认字符编码格式ANSI 函数签名为: int main(); int main(int argc, char* argv[]);
_tmain()是微软操作系统(windows)提供的对unicode字符集和ANSI字符集进行自动转换用的程序入口点函数。 函数签名为: int _tmain(int argc, TCHAR *argv[])
当你程序当前的字符集为unicode时,int _tmain(int argc, TCHAR *argv[])会被翻译成 int wmain(int argc, wchar_t *argv[]

作者:zhangcancai
来源:CSDN
原文:https://blog.csdn.net/zhangcancai/article/details/45168957

OK,我们来运行下我们的程序先为好,Ctrl+s保存一下先,点击生成————生成解决方案,然后点调试–开始执行不调试。好吧,有的同学会对右边的窗口属性以及对为什么导入库文件的方式不同,就像<>和""的区别在哪,哈哈好在我又看到了一篇非常不错的文章,复制一下先。
VS的推荐路径不同,现在VS都有一个功能叫intellisense,如下:

这个主要帮我们快速完成代码,上图中的每一项功能都非常实用,现在主要说下第一个功能“列出成员”。当你在<>中间输入ios的时候,vs会给你推荐符合这个前缀的头文件,如下:

你可以通过上下选择后按Tab键让VS帮你快速完成代码,很像当时的VA(一款VS插件)。如果你用的是“”,VS则不会给你推荐“iostream”。所以问题来了:是什么决定VS在哪个路径下搜索头文件?

答案就是项目属性中的VC++目录。我们先看下VC++里面和头文件引用相关的部分,就是这个包含目录:

我的 iostream 头文件是在 $(VC_IncludePath)的文件夹下面,所以在使用#include<>的时候VS会在这个途径下推荐接近的头文件。从上图可以看到我们创建项目后并没有主动添加路径到这个包含目录里面,而是直接继承了 ( V C I n c l u d e P a t h ) 和 (VC_IncludePath)和 (VCIncludePath)(WindowsSDK_IncludePath)这两个值。要说到它们怎么来的,这就要讲到VS的另一个重要的管理器——属性管理器。

来看下属性管理器:

看上图,Debug|Win32下面有四个属性表依次(从下往上)是:Core Windows Libraries,Multi-byte Character Support,Application,Microsoft.Cpp.Win32.user。还记得之前我们说的配置管理器里的Debug和Release吗?如果Debug在没有用户更改默认属性的情况下,debug其实等价于把这四个属性表拼起来,每一个属性表都表示属性页里面的一部分信息,比如看下Core Windows Libraries这个属性表:

从上面可以看到这个属性表其实加载的是程序所需要的系统32位dll的lib链接。上面四个属性表就对应了我们的这个项目的属性组合:C++、Win32、多字节。但是, ( V C I n c l u d e P a t h ) 和 (VC_IncludePath)和 (VCIncludePath)(WindowsSDK_IncludePath)不是被它们加入到项目,真正加入这两个东西的也是一个.props文件,叫Toolset.props。为什么在属性管理器里面看不到这个属性表呢,因为它加载的方式比较特殊,是在.vcxproj文件里面加载的,如下:

上图是.vcxproj文件的一个片段,这一句<Import … .props />就是加载属性表的另一种方式。我这里并没有把怎么一步步链接到Toolset.props的过程记录下来,因为每个属性表里面还有很多加载属性表的语句,层层嵌套。总之就是VS根据我们选择的工具集版本,也就是VS2017(v141),最终加载到Toolset.props,下面是这个属性表的部分代码:

如上图标注的内容,VC++目录下的所谓继承的值都来自这里。

好,这下我们可以理解#include<>的搜索路径是VC++目录的包含目录,那“”中的路径位置又在哪里呢?就在下图中的附加包含目录:

结论:“”的搜索路径是保存在C/C++的附加包含目录里,而<>是在VC++目录的包含目录中。所以,你如果不想自己的头文件和一大堆Windows的标准库文件混在一起的话,那就在附加包含目录里添加你自己的include文件夹,并且在使用的时候用#include“”.

最后讲一个题外话,为什么是#include,这个iostream文件为什么这么厉害都不用.h后缀也可以被编译器当成头文件来读取。其实头文件对后缀名没有任何要求,你可以是任意后缀,或者像iostream一样不加后缀,都可以编译。只要你的文本格式和语法和头文件一样就行,你看我改成.x文件也可以编译运行:

如果你把头文件名字改成标准库中一样如:algorithm,ios,iostream,那你还能享受VS的语法高亮待遇:


作者:Mr_L_Y
来源:CSDN
原文:https://blog.csdn.net/luoyu510183/article/details/83795054
版权声明:本文为博主原创文章,转载请附上博文链接!
好吧其实或许有的人会对两个概念不清,就是sin和vcxproj。
sln是解决方案的配置,主要是管理这个方案里的多个vcxproj
vcxproj是工程的配置文件,管理工程中细节比如包含的文件,引用库等
一般没有sln,也可以直接打开vcxproj,也可以重新生成sln
sln里有多个工程,当你移除某个工程时sln会有变化,sln并不是太重要。
对于不理解动态链接库和静态链接库的可以看这个链接。https://blog.csdn.net/qq_20777367/article/details/72772902
和这个
首先,得明确下,这两者都是共享代码的一种方式。共享代码就是说,一帮程序员要开发一个项目,如果每个人做的不同块中有相同的功能,那么,在最后的封装中,可以把相同代码塞到链接库里(这样就不用写n遍了,节约空间)。

实际上,这两种方式各有各的优点。

1:静态链接库的优点

(1) 代码装载速度快,执行速度略比动态链接库快。原因:你一开始就调用了整个静态链接库,so,不用一个个装载当前用的函数或者方法;

(2) 只需保证在开发者的计算机中有正确的.LIB文件,在以二进制形式发布程序时不需考虑在用户的计算机上.LIB文件是否存在及版本问题。(实际上:这是.lib非常实用的一个优点= =。也许你不信,但是当你掉进.dll地狱不可自拔的时候,你就会发现.lib的实用性了)。

2 动态链接库的优点

(1) 更加节省内存并减少页面交换。原因:仅仅调用自己需要的,不需要的就不调用,所以减少内存(减少页面交换同理);

(2) DLL文件与EXE文件独立,只要输出接口不变(即名称、参数、返回值类型和调用约定不变),更换DLL文件不会对EXE文件造成任何影响,因而极大地提高了可维护性和可扩展性;

(3) 不同编程语言编写的程序只要按照函数调用约定就可以调用同一个DLL函数(当然你必须遵守函数调用约定。这东西可以视为一种协议。);

(4)由于具有以上三种性质,所以.dll适用于大规模的软件开发,使开发过程独立、耦合度小,便于不同开发者和开发组织之间进行开发和测试(你可以理解为模块化程度高)。

两者的不足:

(1) 使用静态链接生成的可执行文件体积较大,包含相同的公共代码,造成浪费(这就是重复代码一遍遍被封装的原因);

(2) 使用动态链接库的应用程序不是自完备的,它依赖的DLL模块也要存在,如果使用载入时动态链接,程序启动时发现DLL不存在,系统将终止程序并给出错误信息。而使用运行时动态链接,系统不会终止,但由于DLL中的导出函数不可用,程序会加载失败;速度比静态链接慢。当某个模块更新后,如果新模块与旧的模块不兼容,那么那些需要该模块才能运行的软件,统统撕掉。这在早期Windows中很常见(见没见过“缺少XXX.dll,程序无法运行”??如果你的用户是个ZZ。不小心删掉了,那就GG了)。

简单来说,就是:.lib用空间换时间,.dll用时间换空间。然而,它们在实战中都是非常实用的共享代码方法。

作者:RationOvO深蓝
来源:CSDN
原文:https://blog.csdn.net/qq_33346538/article/details/77506517
版权声明:本文为博主原创文章,转载请附上博文链接!
对于解决方案和,一个大型的项目的工作环境就是解决方案,而工程只不过是解决方案下的一个子工程。一般我们没有重命名的话,解决方案的名字和子工程的名字就是同一个。
对于解决方案下相关的文件可以参考https://msdn.microsoft.com/en-us/library/vstudio/hx0cxhaw(v=vs.110).aspx
行,接下来就来考虑一下怎么在源文件中添加头文件和附加库。
方法一:直接在源程序中添加完整目录#include"C/ProGram Files/sale_data.h
方法二:解决方法-项目名-属性-配置属性-vc++目录–包含目录,然后添加头文件所在的目录路径
方法三:解决方法-项目名-属性-配置属性–C/;C+±-常规–附加属性目录:
方法四:解决方法–项目名-属性-配置属性–连接器–输入–附加依赖项

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值