为什么Visual Studio运行时库源代码存储在两个目录中?

时间:2014-06-13 09:17:06

标签: windows visual-studio visual-c++ visual-studio-2013

似乎有两个路径包含Microsoft Visual Studio运行时源文件:

  

C:\ Program Files(x86)\ Microsoft Visual Studio 12.0 \ VC \ crt \ src

  

C:\ Program Files(x86)\ Microsoft Visual Studio 12.0 \ VC \ include

某些文件出现在两个目录中,但大小不同。我特别查看了一个文件,它在两个文件中都定义了相同的方法。

所以我的问题是,这两条路径的使用有什么不同?我想在Visual Studio中调试时(我不是指调试模式),哪个文件是屏幕上的代码?

2 个答案:

答案 0 :(得分:11)

include目录包含所有公共标头。这些是您可以在代码中包含的标头,例如<stdio.h><type_traits>,以及这些标头所需的实施标头。

crt\src目录包含CRT源,包括用于构建CRT的大多数.asm.c.cpp文件。此目录还包含许多CRT标头的副本,在某些情况下,这些标头与include目录中的标头不同。这纯粹是CRT如何构建的工件。

调试CRT标头中定义的内联代码时,调试器应始终选择正确的标头。如果两个目录都包含相同的标题副本,那么调试器只会选择一个,因为标题是相同的,所以它选择哪一个并不重要。如果标题不同,那么调试器选择哪个标头取决于编译内联函数的对象。如果该对象是CRT的一部分,您将从crt\src步入标题;如果对象来自您的某个源文件,则您将从include步入标题。基本上,调试器应始终能够找到标头的正确副本。

我们在Visual Studio&#34; 14&#34;中大大简化了这一点。 CTP。 crt\src目录中不再有任何公共标题,include目录中提供的标题与用于构建CRT的标题相同。

答案 1 :(得分:1)

CRT位于Visual C ++库堆栈的底部:其余库依赖于它,实际上所有本机模块也依赖于它。它包含两种内容:(1)C标准库和各种扩展,以及(2)进程启动和异常处理等所需的运行时功能。因为CRT位于堆栈的底部,所以它是开始稳定库的过程的合理位置。


来自The Great C Runtime (CRT) Refactoring by James McNellis

(1)我们使用Visual Studio运送CRT的大部分资源;您可以在VC\crt\src下的Visual Studio安装目录中找到它们。

(2)在Visual Studio 2013中,我们发布的来源中有6,830 #if#ifdef#ifndef#elif#else指令与产品;在Visual Studio&#34; 14&#34; CTP有1,656。这些数字不包含标题中的指令,它们确实包含STL源文件,这些文件在很大程度上不受此重构工作的影响,因此这不是完美的测量,但它表明了#39的清理量。已经完成了。