Проблема, связанная с C-заголовком Visual Studio 2015, при попытке скомпилировать DOSBox SVN Daum в Windows 10

У меня возникают проблемы, связанные с заголовком, по-видимому, новые для VS2015, при попытке скомпилировать DOSBox SVN Daum в Windows 10. Примеры:

Severity    Code    Description Project File    Line    Suppression State
Error (active)      the global scope has no "int_least8_t"  dosbox  c:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\cstdint  23  
Error   C2039   'int_least8_t': is not a member of '`global namespace'' dosbox  C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\cstdint  23  

Мой поиск говорит мне, что такая проблема возникает в проектах, но я не могу ее исправить.

В частности, я прочитал VisualStudio 2015 RC Проблема с включениями и https://blogs.msdn.microsoft.com/vcblog/2015/03/03/introduction-the-universal-crt/ , а затем изменил содержимое AppData\Local\Microsoft\MSBuild\v4.0\Microsoft.Cpp.Win32.user.props на:

<?xml version="1.0" encoding="utf-8"?> 
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ImportGroup Label="PropertySheets">
  </ImportGroup>
  <PropertyGroup Label="UserMacros" />
  <PropertyGroup>
    <IncludePath>D:\dev\include;$(UniversalCRT_IncludePath);$(IncludePath)</IncludePath>
    <LibraryPath>D:\dev\lib;$(UniversalCRT_LibraryPath_x86);$(LibraryPath)</LibraryPath>
  </PropertyGroup>
  <ItemDefinitionGroup />
  <ItemGroup />
</Project>

Однако не повезло. :(

Картинки:

Каталоги VC++Стандарт VC++  -ошибки компиляции, связанные с заголовком

Я далеко не опытный программист на C. Кто-нибудь может сказать мне, чего не хватает? Спасибо!


person bernardo.m.luz    schedule 09.12.2016    source источник


Ответы (1)


У меня была такая же проблема с другой программой, и после просмотра включений я наконец решил ее.

Если вы посмотрите на типичный cstdint из недавней Visual Studio, вы заметите, что одно включение — это stdint.h. Именно здесь существуют фактические определения для различных типов. Что делает cstdint, так это экспортирует определения, чтобы они были членами пространства имен std.

Однако здесь видно, что первые строки с intXX_t скомпилированы нормально, а int_least_xx_t нет. Это потому, что он читает неправильный файл stdint.h, в котором нет некоторых необходимых определений. Этот файл был написан людьми, которые хотели использовать именованные размеры до того, как MSVC поддержал их (они пришли с C99, который MSVC так и не удосужился поддержать, а затем на C++ 11, который на тот момент предлагал поддержку MSVC).

Поскольку им нужны были только точные типы, они не писали определения для других типов. Теперь, когда MSVC поддерживает его, в этом файле совместимости нет необходимости. Однако из-за того, что файлы проектов не были обновлены, компилятор найдет заголовок с плохой совместимостью вместо правильного, что и приводит к этой ошибке.

Есть два способа решить эту проблему: изменить порядок включаемых папок, чтобы он получал тот, который вам нужен, или удалить плохой файл stdint.h. Его легко найти, так как вы можете использовать Visual Studio для открытия #include файлов. В вашем случае файл находится в каталоге src/platform/visualc/.

Приложение: это мой неисправный файл stdint.h

#pragma once

/* a minimal set of C99 types for use with MSVC */

typedef signed char int8_t;
typedef short int int16_t;
typedef int int32_t;
typedef __int64 int64_t;

typedef unsigned char uint8_t;
typedef unsigned short int uint16_t;
typedef unsigned int uint32_t;
typedef unsigned __int64 uint64_t;
person meneldal    schedule 18.07.2019