VS开发C++的一些问题——VS项目工程文件、Debug与Relase模式、字符集问题以及_T()宏

本文最后更新于:2021年1月26日 下午

简介:VS工程项目相关文件,如何让自己编好的程序在其他电脑上运行,字符集

VS工程项目相关文件

VS是使用解决方案来管理项目的,同一个解决方案之下就可以添加多个项目。

而在多个项目的时候,一般编译调试都是执行的第一个创建的项目,此时可以选择 右键“解决方案”-->设置启动项目-->通用属性里的启动项目-->选定当前选定内容。

总的来说解决方案会对应一个文件夹,文件夹里会有不同的项目文件夹。

sdf文件是一个数据库文件,记录了解决方案的各种信息。

opensdf文件是项目被打开时才会出现的,项目关闭后此文件也会消失,估计是sdf文件的临时文件。

sln文件是整个解决方案的配置文件,(Microsoft Visual Studio Solution),通过VS2013打开sln文件就可以将整个解决方案导入到VS中打开。

sln(Visual Studio.Solution)通过为环境提供对项目、项目项和解决方案在磁盘上的位置的引用,可以将他们组织到解决方案中。

suo文件(Visual Studio Solution User Options)是解决方案用户选项

suo 解决方案用户选项,记录所有将与解决方案建立关联的选项,存储了用户对界面的自定义配置,包括布局、断点、打开的文件等。

在Project1中写一个HelloWorld语句之后,Project1项目文件夹如下所示

vcxproj文件是项目文件,保存了整个项目的配置信息。经过测试可以通过打开这个文件来直接打开这个项目以及解决方案。

vc5,6的工程文件是.dsp

vc2002-2008工程文件是vcproj

vc2010之后是vcxproj

vcproj和vcxproj都是xml格式的。

vcxproj.filters文件是文件存放工程的虚拟目录信息,也就是在解决方案浏览器中的目录结构信息。

cpp文件就不用多说了🙃

Debug文件夹是VS在 Debug 模式下编译链接执行后生成的文件夹, 与之相对应的是 Release 模式,在此模式下就会生成Release文件夹。

打开Debug文件夹,其内有上述这些文件。

log文件是主要记录编译过程中的输出信息、日志。可以打开看看,内容和执行时的内容差不多。

pdb文件调试的符号文件,程序数据库 (PDB) 文件保存着调试和项目状态信息,使用这些信息可以对程序的调试配置。

obj文件是C、CPP编译后的二进制文件。

VS执行生成的可执行文件放在解决方案目录里的Debug目录里。

exe文件是编译链接后产生的可执行文件

ilk文件 增量编译(incremental linking)

取消增量编译可以不生成这种文件,对于大工程来说可能会变慢。

最后摘抄一段话

一般情况下,如果我们要把源码共享到github中,只需要提交工程相关的配置文件,不提交用户个人偏好相关的配置文件。所谓的个人偏好相关,是指根据用户个人的VS使用习惯而保存的配置信息,比如选择了查看所有文件选项,打开了某一个文件。而工程相关的配置是指工程建立相关的信息,不受用户偏好的影响,比如解决方案的名字是什么,这个解决方案下面有哪些project。所以,我们只需要上传sln配置文件、vcxproj和vcxproj.filters配置文件就可以了,当然还包括源码。

本文参考链接:

Visual Studio项目目录和文件说明

Visual Studio 项目各类文件概述

vs2017的文件组成

VS各种文件作用详解

Visual Studio 2017工程项目的几个重要文件解析

sln、db、opendb、vcxproj、filters、user文件跟踪说明

VS2013如何打包生成安装文件

如何让自己编好的程序在其他电脑上运行

两种模式:Debug与Relaese的区别

Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。

Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。

参考链接:百度百科

发布可执行程序

VC2013 默认编写的 .exe 使用动态链接方式链接的运行时库,所以,编写的程序要在别的电脑上运行,需要在其它电脑安装 VC2013 的运行时库,然后就可以完美运行你的 .exe 程序。

当然,如果你觉得安装运行时库很麻烦,你可以用静态链接的形式编译你的 .exe 程序。

中文版 Visual Studio 2013 的操作方法:

  1. 打开 Visual Studio 2013,创建 Win32 控制台应用程序(或者 Win32 项目)。

  2. 编写程序。

  3. 项目编译模式默认分为 Debug 和 Release 两种模式。Debug 模式带有各种调试信息,方便排查错误,使用的调试版本库。Release 模式删除了调试信息,使得编译的文件更小,执行速度更快。因此,在调试程序的时候,要用 Debug 模式。在调试完毕需要发布程序的时候,用 Release 模式。两种模式有不同的编译设置,我们现在需要将完成的程序发给别人,因此需要将项目设置为 Release 模式。

  4. 在 解决方案资源管理器 区域中,选中你的 项目(通常第一行是 解决方案,第二行是 项目),右击,选 属性。

  5. 左侧类别中选择“配置属性 -> C/C++ -> 代码生成”,右侧将“运行时库”设置为“多线程(/MT)”。

  6. 如果你希望你的程序可以运行在 WinXP 中,还需要设置“配置属性 -> 常规 -> 平台工具集”为“Visual Studio 2013 - Windows XP (v120_xp)”。

  7. 编译程序。在项目文件夹的 Release 文件夹里面,可以找到最终编译的 .exe 文件,拷贝出来即可在别的电脑上运行。

采用上面的方法就可以发布Release模式的exe可执行文件,可以拷贝出来在其他电脑上运行。

参考链接:慢羊羊村长的博客:使 VC2013 编写的程序运行在其它电脑上

VS字符集的问题

在VS里面右击项目名称,最后一项是”属性“,点进去就可以看到字符集设置的问题。

项目字符集

主要有两种选择,一种是Unicode字符集,另一种是多字节字符集

Windows是使用两种字符集:ANSI 和 Unicode编码。

ANSI是通常使用的单字节处理方式,所有字符都通过一个字节进行表示,这样对于处理中文这样的双字节字符非常不友好。

在最初的时候,Internet上只有一种字符集——ANSI的ASCII字符集,它使用7 bits来表示一个字符,总共表示128个字符,其中包括了英文字母、数字、标点符号等常用字符。之后,又进行扩展,使用8 bits表示一个字符,可以表示256个字符,主要在原来的7 bits字符集的基础上加入了一些特殊符号例如制表符。

后来,由于各国语言的加入,ASCII已经不能满足信息交流的需要,因此,为了能够表示其它国家的文字,各国在ASCII的基础上制定了自己的字符集,这些从ANSI标准派生的字符集被习惯的统称为ANSI字符集,它们正式的名称应该是MBCS(Multi-Byte Chactacter System,即多字节字符系统)。这些派生字符集的特点是以ASCII 127 bits为基础,兼容ASCII 127,他们使用大于128的编码作为一个Leading Byte,紧跟在Leading Byte后的第二(甚至第三)个字符与Leading Byte一起作为实际的编码。这样的字符集有很多,我们常见的GB-2312就是其中之一。

Unicode编码是双字节编码。

由于每种语言都制定了自己的字符集,导致最后存在的各种字符集实在太多,在国际交流中要经常转换字符集非常不便。因此,提出了Unicode字符集,它固定使用16 bits(两个字节、一个字)来表示一个字符,共可以表示65536个字符。将世界上几乎所有语言的常用字符收录其中,方便了信息交流。标准的Unicode称为UTF-16。后来为了双字节的Unicode能够在现存的处理单字节的系统上正确传输,出现了UTF-8,使用类似MBCS的方式对Unicode进行编码。注意UTF-8是编码,它属于Unicode字符集。Unicode字符集有多种编码形式,而ASCII只有一种,大多数MBCS(包括GB-2312)也只有一种。Unicode的最初目标,是用1个16位的编码来为超过65000字符提供映射。但这还不够,它不能覆盖全部历史上的文字,也不能解决传输的问题 (implantation head-ache’s),尤其在那些基于网络的应用中。已有的软件必须做大量的工作来程序16位的数据。因此,Unicode用一些基本的保留字符制定了三套编码方式。它们分别是UTF-8,UTF-16和UTF-32。正如名字所示,在UTF-8中,字符是以8位序列来编码的,用一个或几个字节来表示一个字符。这种方式的最大好处,是UTF-8保留了ASCII字符的编码做为它的一部分,例如,在UTF-8和ASCII中,“A”的编码都是0x41.UTF-16和UTF-32分别是Unicode的16位和32位编码方式。考虑到最初的目的,通常说的Unicode就是指UTF-16。

两种编码集推荐使用Unicode编码:

(1) 可以很容易地在不同语言之间进行数据交换
(2) 使你能够分配支持所有语言的单个二进制.exe文件或DLL文件
(3) 提高应用程序的运行效率

以上引用的内容均来自博客:Unicode字符集和多字节字符集关系,此外博客还有许多内容可以学习哦~

C++ _T()与L宏

然后就又关于字符串保存的问题,有两种方式,一种是 _T( ) 的形式,另一种是 L" " 的形式。

1
2
TCHAR s[] = _T("你好啊!");
TCHAR s[] = L"你也是!";

先暂时忽略TCHAR ,上面的代码是两种字符串保存的方式。

当工程是Unicode编码时,_T将括号内的字符串以Unicode方式保存;

当工程是多字节编码时,_T将括号内的字符串以ANSI方式保存。

关键字“L”,则是不管编码环境是什么,都是将其后面的字符串以Unicode方式保存。

Unicode字符是LPCWSTR

ASCII字符是LPCSTR

通过强制转换是无法完成的,需要用_T()和L()来完成转换

参看博客:C++ _T()和L()宏

各种字符类型😱

上图来自博客:C++字符类型总结区别wchar_t,char,WCHAR emmm,就是有非常丰富的类型。具体内容可以参看超链接里的那篇博客。

其他参看博客:宽字符wchar_t和窄字符char——putwchar、wprintf

VS快捷键

  • 多行注释:选中,然后Ctrl+K,然后Ctrl+C即可注释。

  • 取消注释:选中,然后Ctrl+K,然后Ctrl+U即可取消注释。

VS使用中碰到的问题

模块对于 SAFESEH 映像是不安全的。

解决方法:属性 –> 链接器 –> 命令行,然后在其他选项这个框中,填入/SAFESEH:NO,就好了。

提示函数过时或者不安全

一种方式是将函数修改为VS建议的函数。

另一种方式是添加_CRT_SECURE_NO_WARNINGS来让VS忽略这些问题,一种添加是在文件开头添加宏#define _CRT_SECURE_NO_WARNINGS,另一种方式是在属性页 –> C/C++ –> 预处理器 –> 预处理器定义,添加_CRT_SECURE_NO_WARNINGS即可。

VS工具 —— 开发人员命令工具提示符

点击打开,然后切换路径到达你CPP文件所在的路径。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
D:\Program Files (x86)\Microsoft Visual Studio\2017\Community>cd D:\Code\VS2017\CProgram\Program\11 多态

D:\Code\VS2017\CProgram\Program\11 多态>dir
驱动器 D 中的卷没有标签。
卷的序列号是 1AF9-4F82

D:\Code\VS2017\CProgram\Program\11 多态 的目录

2021/01/26 14:14 <DIR> .
2021/01/26 14:14 <DIR> ..
2021/01/26 14:14 191 11 多态.cpp
2021/01/26 12:21 7,626 11 多态.vcxproj
2021/01/26 12:21 954 11 多态.vcxproj.filters
2021/01/26 12:21 165 11 多态.vcxproj.user
4 个文件 8,936 字节
2 个目录 177,054,085,120 可用字节

使用cd命令切换,使用dir命令查看当前路径下的文件。

输入命令:cl /d1 reportSingleClassLayout类名 "文件名.cpp"

1
cl /d1 reportSingleClassLayoutCat "11 多态.cpp"

注意类名与前面一串英文之间没有间隔。

  • 这段命令可以查看在”11 多态.cpp”这个文件中,类Cat的构造。
1
2
3
4
5
6
7
class Cat       size(8):
+---
0 | +--- (base class Animal)
0 | | age
| +---
4 | id
+---

而Cat的实际定义为:

1
2
3
4
5
6
7
8
9
class Animal {
public:
int age;
};

class Cat:public Animal {
private:
int id;
};