当路径中存在同名文件时,跨平台方式包含系统头文件?

GBl*_*ney 8 c c++ macros visual-studio

我试图让Bloomberg的BDE库在Visual Studio 2015中编译.因为它们重新实现了编译器通常提供的标准库,所以有一些头文件的名称与标准库名称完全匹配,例如stddef.h.它们可选地允许您关闭标准库的覆盖,为此,它们重新实现的文件可选地只包括原始编译器提供的版本,例如stddef.h.他们这样做包括通过宏,如下所示:

#   if defined(BSLS_COMPILERFEATURES_SUPPORT_INCLUDE_NEXT)
#     include_next <stddef.h>
#   else
#     include BSL_NATIVE_C_LIB_HEADER(stddef.h)
#   endif
Run Code Online (Sandbox Code Playgroud)

资源

在哪里BSL_NATIVE_C_LIB_HEADER扩展到这样的东西:

#if defined(BSLS_PLATFORM_CMP_SUN) // Sun Compiler
#   define BSL_NATIVE_C_LIB_HEADER(filename) <../include/filename>

#elif defined(BSLS_PLATFORM_CMP_CLANG) || defined(BSLS_PLATFORM_CMP_GNU)
  // Clang and GCC use 'include_next'

#elif defined(BSLS_PLATFORM_CMP_HP) // HP Compiler
#   define BSL_NATIVE_C_LIB_HEADER(filename) <../include_std/filename>

#else
  // Most other compilers
#   define BSL_NATIVE_C_LIB_HEADER(filename) <../include/filename>

#endif
Run Code Online (Sandbox Code Playgroud)

资源

问题是Visual Studio 2015 引入了一些重构,将一些 C标准库头文件移动到这样的路径:C:\Program Files (x86)\Windows Kits\10\Include\10.0.10150.0\ucrt.这显然意味着 <../include/filename>将不再找到移动的文件.问题是所有文件都没有移动.例如,iso646.h仍然存在C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include并将被包含.

所以这里是我的问题,简而言之:有没有办法可以继续支持BSL_NATIVE_C_LIB_HEADER所使用的宏,而在幕后确定导入是应该来自../ucrt/还是../include基于文件名?我知道我可以创建两个单独的宏,但如果可能的话,我宁愿保持接口相同.

chq*_*lie 0

您可以创建一个单独的目录../VC14-include-compat,其中包含虚拟包含文件,这些文件重定向到每个标准包含文件的实际位置。

一个更简单的方法是修补 VC14 包含目录以添加丢失的文件并明确地将它们包含在目录中。

另外,为什么不使用替代方法并包含目录中的 bsl 包含文件bsl/bsl+bslhdrs而不是bsl/bsl+stdhdrs. 您将需要修改源文件以包含例如<bsl_c_stddef.h>而不是<stddef.h>,但这将使您的项目更加可移植。

BDE 库有 170 万行代码,祝您在解决任何其他可移植性问题时好运!