Почему clang_getEnumDeclIntegerType libclang возвращает разные результаты в Linux и Windows?

Рассмотрим этот простой файл C, file.c:

enum X {
    A,
    B
}

Давайте определим базовый тип перечисления, используя libclang:

#include <stdio.h>
#include <clang-c/Index.h>

enum CXChildVisitResult visitor(CXCursor cursor, CXCursor parent, CXClientData client_data)
{
    if (clang_getCursorKind(cursor) == CXCursor_EnumDecl) {
            enum CXTypeKind kind = clang_getEnumDeclIntegerType(cursor).kind;
            printf("Type: %s\n", clang_getCString(clang_getTypeKindSpelling(kind)));
    }

    return CXChildVisit_Recurse;
}

int main()
{
    CXIndex index = clang_createIndex(0, 0);
    CXTranslationUnit unit = clang_parseTranslationUnit(index, "file.c", NULL, 0, NULL, 0, CXTranslationUnit_None);
    CXCursor cursor = clang_getTranslationUnitCursor(unit);
    clang_visitChildren(cursor, visitor, NULL);
}

Это печатает Int в Windows (Win10, набор инструментов VS 2015, предварительно скомпилированный clang 6.0) и Uint в Linux (Ubuntu Xenial в подсистеме Linux для Windows, пакеты clang 6.0).

Почему это? Есть ли способ сделать вывод одинаковым на разных платформах?


person Solal Pirelli    schedule 11.06.2018    source источник
comment
Используйте перечисления с областью действия, чтобы указать базовый тип.   -  person Millie Smith    schedule 11.06.2018
comment
Не существует кросс-платформенной гарантии размера или подписи типа перечисления. Различия между платформами, вероятно, сводятся к произвольному выбору, сделанному несколько десятилетий назад, а обратная совместимость поддерживается вплоть до настоящего времени. Связано: stackoverflow.com/questions/2579230/   -  person    schedule 11.06.2018
comment
единственное требование к типу состоит в том, что он может содержать все значения, определенные в перечислении. если вы хотите сделать его кроссплатформенным, вам нужно указать тип и установить значения для всех полей   -  person Tyker    schedule 11.06.2018