> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Xbox 编译器技术

> XBOX 编译器技术

XBOX 的编译器是随 Visual Studio 一起提供的 Visual C++ x64 编译器。请使用 Visual Studio 2022 (17.12 或 17.14) 或最新的 Visual Studio 2026 更新。

XBOX 开发还支持 clang/LLVM for Windows v11 或更高版本。此工具集使用 Visual C/C++ 运行时。如果使用 MSBuild，请使用 Visual Studio 2019 或 Visual Studio 2022 的 clang/LLVM 集成。

其他工具集和运行时组合可能无法运行或无法通过认证。

有关升级 Visual C++ 代码的详细信息，请参阅 [Visual C++ 移植和升级指南](https://learn.microsoft.com/cpp/porting/visual-cpp-porting-and-upgrading-guide)。

> [!NOTE]
>
> XBOX 工具仅支持将 Microsoft 程序数据库 (PDB) 文件用于调试符号。它不支持 LLVM `.ld` 文件发出的 CodeView 或 DWARF 调试信息。

## C++14、C++17 和 C++20 语言版本和功能

Visual Studio 2019、Visual Studio 2022 和 Visual Studio 2026 支持 C++11、C++14 和 C++17。Visual Studio 2022 和 Visual Studio 2026 还支持 C++20。

| 编译器版本 | 版本宏 | 发行版 | 说明 |
| - | - | - | - |
| 19.20 | \_MSC\_VER == 1920 | Visual Studio 2019 (版本 16.0) | [Visual Studio 2019 中的 C++17/20 功能和修复](https://devblogs.microsoft.com/cppblog/cpp17-20-features-and-fixes-in-vs-2019/) |
| 19.21 | \_MSC\_VER == 1921 | Visual Studio 2019 (版本 16.1) | |
| 19.22 | \_MSC\_VER == 1922 | Visual Studio 2019 (版本 16.2) | |
| 19.23 | \_MSC\_VER == 1923 | Visual Studio 2019 (版本 16.3) | |
| 19.24 | \_MSC\_VER == 1924 | Visual Studio 2019 (版本 16.4) | |
| 19.25 | \_MSC\_VER == 1925 | Visual Studio 2019 (版本 16.5) | [C++20 模块](https://devblogs.microsoft.com/cppblog/c-modules-conformance-improvements-with-msvc-in-visual-studio-2019-16-5/) |
| 19.26 | \_MSC\_VER == 1926 | Visual Studio 2019 (版本 16.6) | [VS 2019 16.1 至 16.6 中的 C++20 功能和修复](https://devblogs.microsoft.com/cppblog/c20-features-and-fixes-in-vs-2019-16-1-through-16-6/) |
| 19.27 | \_MSC\_VER == 1927 | Visual Studio 2019 (版本 16.7) | [STL 功能和修复](https://github.com/microsoft/STL/wiki/VS-2019-Changelog#vs-2019-167) |
| 19.28 | \_MSC\_VER == 1928 | Visual Studio 2019 (版本 16.8) | [C++20 模块](https://devblogs.microsoft.com/cppblog/standard-c20-modules-support-with-msvc-in-visual-studio-2019-version-16-8/)  [C++20 协同例程](https://devblogs.microsoft.com/cppblog/c-coroutines-in-visual-studio-2019-version-16-8/)  [C++20 语言功能](https://devblogs.microsoft.com/cppblog/c20-features-in-visual-studio-2019-versions-16-7-and-16-8/)  [STL 功能和修复](https://github.com/microsoft/STL/wiki/VS-2019-Changelog#vs-2019-168) |
| 19.28.29910 或更高版本 | | Visual Studio 2019 (版本 16.9) | [STL 功能和修复](https://github.com/microsoft/STL/wiki/VS-2019-Changelog#vs-2019-169) |
| 19.29 | \_MSC\_VER = 1929 | Visual Studio 2019 (版本 16.10) | [C++20 范围](https://devblogs.microsoft.com/cppblog/c20-ranges-are-complete-in-visual-studio-2019-version-16-10/)  [\<format>](https://devblogs.microsoft.com/cppblog/format-in-visual-studio-2019-version-16-10/)  [\<chrono> 的扩展](https://devblogs.microsoft.com/cppblog/cpp20s-extensions-to-chrono-available-in-visual-studio-2019-version-16-10/)  [STL 功能和修复](https://github.com/microsoft/STL/wiki/VS-2019-Changelog#vs-2019-1610) |
| 19.29.30133.0 或更高版本 | | Visual Studio 2019 (版本 16.11) | [C++20 协同例程](https://devblogs.microsoft.com/cppblog/cpp20-coroutine-improvements-in-visual-studio-2019-version-16-11/)  [STL 更改说明](https://github.com/microsoft/STL/wiki/VS-2019-Changelog#vs-2019-161114)  [/std:c++20 开关](https://devblogs.microsoft.com/cppblog/msvc-cpp20-and-the-std-cpp20-switch/) |
| 19.30 | \_MSC\_VER == 1930 | Visual Studio 2022 (17.0) | [STL 功能和修复](https://github.com/microsoft/STL/wiki/VS-2022-Changelog#vs-2022-170) |
| 19.31 | \_MSC\_VER == 1931 | Visual Studio 2022 (17.1) | [STL 功能和修复](https://github.com/microsoft/STL/wiki/VS-2022-Changelog#vs-2022-171) |
| 19.32 | \_MSC\_VER == 1932 | Visual Studio 2022 (17.2) | [MSVC 的 STL 完成 /std:c++20](https://devblogs.microsoft.com/cppblog/msvcs-stl-completes-stdc20/)  [STL 功能和修复](https://github.com/microsoft/STL/wiki/VS-2022-Changelog#vs-2022-172) |
| 19.33 | \_MSC\_VER = 1933 | Visual Studio 2022 (17.3) | [STL 功能和修复](https://github.com/microsoft/STL/wiki/VS-2022-Changelog#vs-2022-173) |
| 19.34 | \_MSC\_VER = 1934 | Visual Studio 2022 (17.4) | [STL 功能和修复](https://github.com/microsoft/STL/wiki/VS-2022-Changelog#vs-2022-174) |
| 19.35 | \_MSC\_VER = 1935 | Visual Studio 2022 (17.5) | [STL 功能和修复](https://github.com/microsoft/STL/wiki/VS-2022-Changelog#vs-2022-175) |
| 19.36 | \_MSC\_VER = 1936 | Visual Studio 2022 (17.6) | [vcpkg](https://devblogs.microsoft.com/cppblog/visual-studio-17-6-for-cpp-devs/)  [STL 功能和修复](https://github.com/microsoft/STL/wiki/VS-2022-Changelog#vs-2022-176) |
| 19.37 | \_MSC\_VER = 1937 | Visual Studio 2022 (17.7) | [STL 功能和修复](https://github.com/microsoft/STL/wiki/VS-2022-Changelog#vs-2022-177) |
| 19.38 | \_MSC\_VER = 1938 | Visual Studio 2022 (17.8) | [STL 功能和修复](https://github.com/microsoft/STL/wiki/VS-2022-Changelog#vs-2022-178) |
| 19.39 | \_MSC\_VER = 1939 | Visual Studio 2022 (17.9) | [MSVC 后端更新](https://devblogs.microsoft.com/cppblog/msvc-backend-updates-since-visual-studio-2022-version-17-3/)  [STL 功能和修复](https://github.com/microsoft/STL/wiki/VS-2022-Changelog#vs-2022-179) |
| 19.40 | \_MSC\_VER = 1940 | Visual Studio 2022 (17.10) | [MSVC 工具集次要版本](https://devblogs.microsoft.com/cppblog/msvc-toolset-minor-version-number-14-40-in-vs-2022-v17-10/)  [STL 功能和修复](https://github.com/microsoft/STL/wiki/Changelog#vs-2022-1710) |
| 19.41 | \_MSC\_VER = 1941 | Visual Studio 2022 (17.11) | [诊断更改](https://devblogs.microsoft.com/cppblog/whats-new-for-cpp-developers-in-visual-studio-2022-17-11/)  [STL 功能和修复](https://github.com/microsoft/STL/wiki/Changelog#vs-2022-1711) |
| 19.42 | \_MSC\_VER = 1942 | Visual Studio 2022 (17.12) | [STL 功能和修复](https://github.com/microsoft/STL/wiki/Changelog#vs-2022-1712) |
| 19.43 | \_MSC\_VER = 1943 | Visual Studio 2022 (17.13) | [C++ 语言更新](https://devblogs.microsoft.com/cppblog/msvc-compiler-updates-in-visual-studio-2022-version-17-13/)  [STL 功能和修复](https://github.com/microsoft/STL/wiki/Changelog#vs-2022-1713) |
| 19.44 | \_MSC\_VER = 1944 | Visual Studio 2022 (17.14) | [C++ 语言更新](https://devblogs.microsoft.com/cppblog/c-language-updates-in-msvc-in-visual-studio-2022-17-14/)  [STL 功能和修复](https://github.com/microsoft/STL/wiki/Changelog#vs-2022-1714) |
| 19.50 | \_MSC\_VER = 1950 | Visual Studio 2026 | [C++ 语言更新](https://devblogs.microsoft.com/cppblog/c-language-updates-in-msvc-build-tools-v14-50/)  [STL 功能和修复](https://github.com/microsoft/STL/wiki/Changelog#msvc-build-tools-1450) |

## 内部函数

Visual C++ 编译器不支持 x64 内联汇编，但支持多种内部函数，以便在 XBOX 开发中使用专用指令集。

> [!NOTE]
>
> 使用任何内部函数的前提是你已验证目标平台支持相应指令。如果不验证支持情况，应用会在运行时引发 `invalid instruction` 异常。请特别注意，XBOX One (AMD Jaguar CPU) 支持 AVX 和 F16C，XBOX Series X|S (AMD Hercules CPU) 还支持 AVX2 和 FMA3。这两个平台都不支持 AVX-512 或更高版本的指令。

| 标头 | 说明 |
| - | - |
| intrin.h | 通用内部函数，特别是 `__cpuid`，以及 CRT 例程的各种内部函数形式。包括 ammintrin.h 和 immintrin.h |
| ammintrin.h | AMD 指令集：SSE5、FMA4 和 XOP 内部函数。   *XBOX One (AMD Jaguar CPU) 和 XBOX Series X\|S (AMD Hercules CPU) 不支持 FMA4 和 XOP*。 |
| immintrin.h | Intel 指令集：[AVX](https://en.wikipedia.org/wiki/Advanced_Vector_Extensions)、AVX2、[BMI、BMI2](https://en.wikipedia.org/wiki/Bit_manipulation_instruction_set)、[FMA3](https://en.wikipedia.org/wiki/FMA_instruction_set) 和 [F16C/CVT16](https://en.wikipedia.org/wiki/F16C) 内部函数。   *XBOX Series X\|S (AMD Hercules CPU) 支持 AVX2、BMI2 和 FMA3，但 XBOX One (AMD Jaguar CPU) 不支持*。 |
| xmmintrin.h | [SSE](https://en.wikipedia.org/wiki/Streaming_SIMD_Extensions) 内部函数和 `__m128` 类型 (单精度浮点 SIMD)。 |
| emmintrin.h | [SSE2](https://en.wikipedia.org/wiki/SSE2) 内部函数和 `__m128i` / `__m128d` 类型 (双精度浮点和整数 SIMD)。 |
| pmmintrin.h | [SSE3](https://en.wikipedia.org/wiki/SSE3) 内部函数 (float/double 水平加减运算、特定的 "dup" 运算)。 |
| tmmintrin.h | [SSSE3](https://en.wikipedia.org/wiki/SSSE3) 内部函数 (更多水平运算、整数 abs、用于增强 SSE2 的 "byte" 混排)。 |
| smmintrin.h | [SSE4.1](https://en.wikipedia.org/wiki/SSE4) 内部函数 (点积、舍入、对 SSE2 增强的 min/max 支持)。 |
| nmmintrin.h | SSE4.2 内部函数。 |
| wmmintrin.h | AES 内部函数。 |
| zmmintrin.h | AVX-512 内部函数。   *XBOX One (AMD Jaguar CPU) 和 XBOX Series X\|S (AMD Hercules CPU) 不支持 AVX-512 内部函数*。 |
| mmintrin.h | Intel MMX 内部函数 (包括 `__m64` 类型)，x64 本机应用程序不支持这些函数。 |
| mm3dnow\.h | AMD 3DNow! 内部函数，x64 本机应用程序不支持这些函数。*x64 本机支持 `_mm_prefetch` / `_m_prefetchw`，它们也在 intrin.h 中定义。* |

> [!NOTE]
>
> Visual Studio 支持 **/arch:AVX** 和 **/arch:AVX2** 开关，这两个开关可启用 AVX 指令集标准中的 [VEX 前缀](https://en.wikipedia.org/wiki/VEX_prefix)。请对所有 XBOX 应用程序使用此开关。有关详细信息，请参阅以下文章。

* [Microsoft Docs：x64 内部函数](https://learn.microsoft.com/cpp/intrinsics/x64-amd64-intrinsics-list)

* [Intel：AVX](https://go.microsoft.com/fwlink/p/?LinkId=251202)

* [Games for Windows and the DirectX SDK 博客：DirectXMath 系列](https://walbourn.github.io/directxmath-sse-sse2-and-arm-neon/)

### clang/LLVM 内部函数

clang/LLVM for Windows 工具集实现了许多与 MSVC 相同的内部函数，但存在一些关键差异：

* clang/LLVM 和 GNUC 处理 SSE SIMD 类型的方式与 Visual C++ 和 Intel 编译器不同。具体而言，`__m128`、`__m128i` 和 `__m128d` 类型是不透明类型而不是结构，因此你无法创建使用这些类型的 C++ 重载函数。这一差异还意味着通过 `__m128.m128_f32[0]` 直接访问元素的代码无法在 clang/LLVM 上编译。

> 因此，使用 clang/LLVM 进行生成时，DirectXMath 会定义 `_XM_NO_XMVECTOR_OVERLOADS_`。为了获得更好的可移植性，你可以在代码中显式定义此宏，以便对 MSVC 也强制执行此行为。

* clang/LLVM 的 *cpuid* 内部函数使用特殊标头 `#include <cpuid.h>`。`__cpuid` 内部函数采用不同的参数列表，而 `__cpuid_count` 等效于 MSVC 的 `__cpuidex`，但参数列表同样不同。

```
#if (defined(__clang__) || defined(__GNUC__)) && (__x86_64__ || __i386__)
#include <cpuid.h>
#else
#include <intrin.h>
#endif
```

```
int CPUInfo[4] = { -1 };
#if defined(__clang__) || defined(__GNUC__)
__cpuid(0, CPUInfo[0], CPUInfo[1], CPUInfo[2], CPUInfo[3]);
#else
__cpuid(CPUInfo, 0);
#endif
```

```
#if defined(__clang__) || defined(__GNUC__)
__cpuid_count(7, 0, CPUInfo[0], CPUInfo[1], CPUInfo[2], CPUInfo[3]);
#else
__cpuidex(CPUInfo, 7, 0);
#endif
```

## 调用约定

x64 本机代码的默认调用约定是 `__fastcall`，详见 [Microsoft Docs](https://learn.microsoft.com/cpp/build/x64-calling-convention)。在 x64 上，`__cdecl` 和 `__stdcall` 调用约定只是 `__fastcall` 的别名。

MSVC 和 clang/LLVM 编译器支持 x86 和 x64 代码的 `__vectorcall` 调用约定。有关详细信息，请参阅
[Visual C++ 团队博客：Introducing 'Vector Calling Convention'](https://devblogs.microsoft.com/cppblog/introducing-vector-calling-convention/) 和 [Microsoft Docs](https://learn.microsoft.com/cpp/cpp/vectorcall)。

## 自动矢量化程序和自动并行化程序

Visual C++ 优化器可以通过自动矢量化程序将标量整数或浮点计算转换为 SIMD 指令。使用 `/O2` 或 `/Ox` 时会自动启用自动矢量化程序。你可以使用 `#pragma loop(no_vector)` 为特定循环禁用它。

这些编译器工具集还支持使用线程对循环进行自动并行化。使用 `/Qpar` 启用自动并行化。你可以使用 `#pragma (loop(hint_parallel(n)))` 为特定循环提供提示。有关详细信息，请参阅以下文章。

* [自动并行化和自动矢量化](https://learn.microsoft.com/cpp/parallel/auto-parallelization-and-auto-vectorization)

## 报告 bug

请 (尽可能) 通过 Visual Studio 的 *报告问题...* 报告 **Visual C++ 编译器** 的 bug。请参阅 [Microsoft Docs](https://learn.microsoft.com/visualstudio/ide/how-to-report-a-problem-with-visual-studio) 和[开发者社区](https://aka.ms/feedback/report?space=62)网站。有关为编译器创建优质 bug 报告的详细信息，请参阅[此页面](https://aka.ms/compilerbug)。

> [!NOTE]
>
> 
> 如果需要更多 NDA 信息才能重现问题，你可以在公开报告的问题中添加标记为 "Microsoft only" 的评论。

若要报告 **clang/LLVM for Windows 编译器** 的 bug，请使用 [https://bugs.llvm.org/](https://bugs.llvm.org/)

若要报告 **Microsoft 标准 C++ 库** (也称为 STL) 的 bug，请使用 [https://github.com/microsoft/STL/issues](https://github.com/microsoft/STL/issues)

与往常一样，对于需要上报的关键问题，请随时联系你的*客户经理*。

## 资源

* [AMD 开发人员指南和手册](https://developer.amd.com/resources/developer-guides-manuals/)

* [Intel 64 and IA-32 Architectures Software Developer Manuals](https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html)

* [Visual Studio 中 Visual C++ 的新增功能](https://learn.microsoft.com/cpp/what-s-new-for-visual-cpp-in-visual-studio)


## Related topics

- [面向主机开发的 Visual Studio](/zh-CN/tools/tools-console/visualstudio/visualstudio.md)
- [Visualstudio](/zh-CN/tools/tools-console/visualstudio/index.md)
- [面向 XBOX GDK 的 HLSL 着色器编译器 (DXC)](/zh-CN/tools/tools-console/shadercompiler/index.md)
- [Visual C++ 编译器和链接器开关建议](/zh-CN/tools/tools-console/visualstudio/compiler-switch-recommendations.md)
- [Visual C++ 编译器资源](/zh-CN/tools/tools-console/visualstudio/compiler-resources.md)
