在 Windows 下开发 C++ 程序

如题,在此做一份备忘,记录在 Windows 下进行 C++ 开发用到的工具、插件及其意义。

当然多少会涉及到如何安装、配置这些工具,但不会多做介绍。

  1. Visual Studio,越新越好,但都有历史包袱
  2. Visual AssistX 破解费时费力,还有兼容问题。非重度用户,可探索 visual studio IDE 自身
  3. vcpkg 包管理器
  4. spdlog 通过 vcpkg 安装
  5. vld, Visual Leak Detector
  6. 不使用制表符,转换为 4 个空格。配置 IDE 实现。

Visual Studio2015 IDE 中需要安装的插件(vc2017 中可能已经内嵌了某些插件的功能)

如何用好

跨平台

在 visual studio 开发 c++ 程序时,编写代码的规范:

  • 文件编码在 utf-8 和 utf-8-bom 中二选一
  • 回车统一使用 Unix(LF) 格式

protoc.exe 生成的源文件是: 两个空格 + utf-8 + Unix(LF)

“监视”窗口中的格式说明符

“监视”窗口中的格式说明符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <string>
#include <iostream>
using namespace std;
int main()
{
char* a = "你好";
char* a1 = "Hello, world";
string b = u8"你好";
auto c = u"你好"; // char16_t*
auto d = U"你好"; // char32_t*
auto e = 68;
cout << a << b << c << d << e << endl;
return 0;
}
名称 类型
a,sb 你好 char *
b,s8 你好 std::basic_string<char,std::char_traits,std::allocator >
c,su L”你好” const char16_t *
d,s32 U”你好” const char32_t *
e,c 68 ‘D’ int
a1,[15] 0x00aed14c “Hello, world\0\0\0” char[15]

调试多线程应用程序

调试多线程应用程序

预编译头

优点就是加快编译速度,YDStockProject 每次编译让我崩溃:一方面源于头文件依赖的混乱;另一方面可能就是源于 JUCE、BOOST 等使用大量模板的头文件的编译。

学习过程中 get 的点

  • 源文件也可以创建预编译头。按需学习,暂时无用

  • 每个源文件只能 #include 一个预编译头,但同一项目中不同源文件可以 #include 不同的预编译头

  • 每个源文件可以单独配置是否使用预编译头。但是我在 gtest-all.cc gmock-all.cc 的设置老是不生效呢?

  • 使用预编译头有好多限制:比如 宏失效等

    When you specify the Use Precompiled Header File (/Yu) option, the compiler ignores all preprocessor directives (including pragmas) that appear in the source code that will be precompiled.

编译警告

msvc 哪些编译警告敏感(eg C4566),哪些警告可以忽略?

避免踩坑

msvc 宇宙第一的 ide 都有哪些坑?

不同版本的 stl 不兼容

谷歌喷 msvc 的 dll

谷歌喷 msvc 的 dll

msvc2015 内嵌的 git 残废

https://stackoverflow.com/questions/37818902/diff-between-commits-in-visual-studio-2015-using-git

https://blog.csdn.net/coolcooldool/article/details/53815939

http://www.codewrecks.com/blog/index.php/2013/03/19/how-to-configure-diff-and-merge-tool-in-visual-studio-git-tools/

编译模式与项目属性

node.js8 在 vs2017 中才支持

msvc2015 用旧编译器的库报错“无法解析的外部符号”

https://blog.csdn.net/hutianyou123/article/details/76577827

https://stackoverflow.com/a/32418900/6728820

不能自由选择 c++ 标准

不能在动态库静态变量或全局变量的析构中 join() 线程

https://github.com/tnie/TestDll/issues/15

Windows 的 cmd 和 powershell 表现不一致

命令路径中存在空格,如何使用? 注意 引号 " 和 斜杠 \ 的相对位置

command cmd 执行结果 power shell 执行结果 备注
"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe" calculator.sln × 表达式或语句中包含意外的标记“calculator.sln”。
"C:\Program Files (x86)\MSBuild\14.0\Bin\"MSBuild.exe calculator.sln × 表达式或语句中包含意外的标记“MSBuild.exe”。
"C:\Program Files (x86)"\MSBuild\14.0\Bin\MSBuild.exe calculator.sln × 表达式或语句中包含意外的标记“\MSBuild\14.0\Bin\MSBuild.exe”。
"C:\Program Files (x86)\"MSBuild\14.0\Bin\MSBuild.exe calculator.sln × 表达式或语句中包含意外的标记“MSBuild\14.0\Bin\MSBuild.exe”。
C:\"Program Files (x86)"\MSBuild\14.0\Bin\MSBuild.exe calculator.sln × MSBUILD : error MSB1008: 只能指定一个项目。
C:"\Program Files (x86)"\MSBuild\14.0\Bin\MSBuild.exe calculator.sln /

powershell 脚本的文件编码必须为 UTF-8 BOM,带 BOM 啊

END