Расширение C/C++ для кода Visual Studio, gcc, Mac: "переменная uint32_t не является именем типа"

Я начал использовать VSC для своих встроенных проектов C с gcc для ARM на Mac. Установив включаемые пути в c_cpp_properties.jsonбольшинство моих #includes сейчас работаем. Тем не менее, такая строка:

uint32_t m_ttff_seconds = 0;

выдает красное волнистое подчеркивание и ошибку:

variable uint32_t is not a type name

Рассматриваемый исходный файл включает stdint:

#include <stdint.h>

и includePath включает в себя:

"${HOME}/dev/gcc-arm-none-eabi-4_9-2015q3/lib/gcc/arm-none-eabi/4.9.3/include"

а также:

"intelliSenseMode": "clang-x64"

(единственный другой вариант msvc-x64).

Кодовая база прекрасно компилируется, когда я использую make и gcc. Как мне показать расширение C/C++, где uint32_t является?

Редактировать:

stdint.h выглядит так:

#ifndef _GCC_WRAP_STDINT_H
#if __STDC_HOSTED__
# if defined __cplusplus && __cplusplus >= 201103L
#  undef __STDC_LIMIT_MACROS
#  define __STDC_LIMIT_MACROS
#  undef __STDC_CONSTANT_MACROS
#  define __STDC_CONSTANT_MACROS
# endif
# include_next <stdint.h>
#else
# include "stdint-gcc.h"
#endif
#define _GCC_WRAP_STDINT_H
#endif

а также stdint-gcc.h содержит:

/* 7.8.1.1 Exact-width integer types */

#ifdef __INT8_TYPE__
typedef __INT8_TYPE__ int8_t;
#endif
#ifdef __INT16_TYPE__
typedef __INT16_TYPE__ int16_t;
#endif
#ifdef __INT32_TYPE__
typedef __INT32_TYPE__ int32_t;
#endif
#ifdef __INT64_TYPE__
typedef __INT64_TYPE__ int64_t;
#endif
#ifdef __UINT8_TYPE__
typedef __UINT8_TYPE__ uint8_t;
#endif
#ifdef __UINT16_TYPE__
typedef __UINT16_TYPE__ uint16_t;
#endif
#ifdef __UINT32_TYPE__
typedef __UINT32_TYPE__ uint32_t;
#endif
#ifdef __UINT64_TYPE__
typedef __UINT64_TYPE__ uint64_t;
#endif

Это предполагает __UINT32_TYPE__ НЕ определяется, когда VSC анализирует мой код, но определяется, когда я собираю с make и gcc.

Редактировать:

После ответа @ mbmcavoy я включаю мой c_cpp_properties.json файл здесь:

{
    "configurations": [
        {
            "name": "Mac",
            "includePath": [
                "${HOME}/dev/gcc-arm-none-eabi-4_9-2015q3/lib/gcc/arm-none-eabi/4.9.3/include",
                "${HOME}/dev/nRF5_SDK_14.0.0_3bcc1f7/components/libraries/util",
                "${HOME}/dev/nRF5_SDK_14.0.0_3bcc1f7/config",
                [many more of these omitted]
                "${HOME}/dev/wisol_SDK_SFM20Rx_master/development/sigfox_cfg2/source",
                "${workspaceRoot}"
            ],
            "browse": {
                "path": [
                    "${HOME}/dev/gcc-arm-none-eabi-4_9-2015q3/lib/gcc/arm-none-eabi/4.9.3/include",
                    "${HOME}/dev/nRF5_SDK_14.0.0_3bcc1f7/components/libraries/util",
                    "${HOME}/dev/nRF5_SDK_14.0.0_3bcc1f7/config",
                    [many more of these omitted]
                    "${workspaceRoot}"
                ],
                "databaseFilename": "${workspaceRoot}/.vscode/browse.vc.db"
            },
            "intelliSenseMode": "clang-x64",
            "macFrameworkPath": [
                "/System/Library/Frameworks",
                "/Library/Frameworks"
            ],
            "defines": [
                "__UINT_LEAST16_MAX__=65535",
                "__UINT_LEAST8_TYPE__=unsigned char",
                "__UINT8_MAX__=255",
                "__UINT_FAST64_MAX__=18446744073709551615ULL",
                "__UINT_FAST8_MAX__=4294967295U",
                "__UINT_LEAST64_MAX__=18446744073709551615ULL",
                "__UINT_LEAST8_MAX__=255",
                "__UINTMAX_TYPE__=long long unsigned int",
                "__UINT32_MAX__=4294967295UL",
                "__UINT16_C(c)=c",
                "__UINT16_MAX__=65535",
                "__UINT8_TYPE__=unsigned char",
                "__UINT64_C(c)=c ## ULL",
                "__UINT_LEAST16_TYPE__=short unsigned int",
                "__UINT64_MAX__=18446744073709551615ULL",
                "__UINTMAX_C(c)=c ## ULL",
                "__UINT_FAST32_MAX__=4294967295U",
                "__UINT_LEAST64_TYPE__=long long unsigned int",
                "__UINT_FAST16_TYPE__=unsigned int",
                "__UINT_LEAST32_MAX__=4294967295UL",
                "__UINT16_TYPE__=short unsigned int",
                "__UINTPTR_MAX__=4294967295U",
                "__UINT_FAST64_TYPE__=long long unsigned int",
                "__UINT_LEAST32_TYPE__=long unsigned int",
                "__UINT8_C(c)=c",
                "__UINT64_TYPE__=long long unsigned int",
                "__UINT32_C(c)=c ## UL",
                "__UINT_FAST32_TYPE__=unsigned int",
                "__UINTMAX_MAX__=18446744073709551615ULL",
                "__UINT32_TYPE__=long unsigned int",
                "__UINTPTR_TYPE__=unsigned int",
                "__UINT_FAST16_MAX__=4294967295U",
                "__UINT_FAST8_TYPE__=unsigned int"
            ]
        }
    ],
    "version": 3
}

Редактировать:

Копая глубже, я обнаружил, что gcc-arm-none-eabi-4_9-2015q3/lib/gcc/arm-none-eabi/4.9.3/include/stdint.h имел __STDC_HOSTED__ определены и, следовательно, stdint-gcc.h на самом деле не был включен. Вместо этого этот заголовок делает "include_next <stdint.h>", который находит gcc-arm-none-eabi-4_9-2015q3/arm-none-eabi/include/stdint.h, Я до сих пор не вижу, где определен unint32_t, ни для gcc, ни для make, ни для VSC.

1 ответ

Попробовав все предложенные решения безрезультатно, я считаю проблему uint32_t ошибкой.

Чтобы решить надоедливые предупреждения в VSCode, просто добавьте следующую строку после раздела #include:

typedef __uint32_t uint32_t;

Делая это один раз в одном файле, он исправляет мои предупреждения VSCode и все еще компилирует.

Я смог решить эту проблему на моей машине (Windows), выполнив три шага:

  1. Применение определений компилятора к расширению C/C++

Вопрос правильный, когда в нем говорится "Это наводит на мысль __UINT32_TYPE__ НЕ определяется, когда VSC анализирует мой код, но он определяется, когда я собираю с помощью make и gcc."У кросс-компилятора ARM есть много встроенных определений, которые не включены в синтаксический анализатор clang-x64.

Во-первых, выяснить, что определяет ваш компилятор gcc, с -dM -E опции. В Windows мне удалось вывести вывод в файл с echo | arm-none-eabi-gcc -dM -E - > gcc-defines.txt

#define __DBL_MIN_EXP__ (-1021)
#define __HQ_FBIT__ 15
#define __UINT_LEAST16_MAX__ 0xffff
#define __ARM_SIZEOF_WCHAR_T 4
#define __ATOMIC_ACQUIRE 2
#define __SFRACT_IBIT__ 0
#define __FLT_MIN__ 1.1754943508222875e-38F
#define __GCC_IEC_559_COMPLEX 0
(etc. - I have 344 defines)

Во-вторых, добавьте определения к вашему c_cpp_properties.json файл. Обратите внимание, что где #define устанавливает значение, вам нужно использовать = подпишите здесь. (Возможно, вы можете просто добавить отдельные определения по мере необходимости, но я использовал Excel для форматирования их по мере необходимости и сортировки. Первые определения относятся к моему проекту, совпадая с определениями в моем файле Makefile.)

"defines": [
    "STM32F415xx",
    "USE_FULL_LL_DRIVER",
    "__USES_INITFINI__",
    "__ACCUM_EPSILON__=0x1P-15K",
    "__ACCUM_FBIT__=15",
    (...)
    "__UINT32_TYPE__=long unsigned int",
    (etc.)
  1. Настройка базы данных символов

Проведя несколько экспериментов с отдельными определениями, я увидел, что определение обрабатывается в stdint-gcc.hЛюбое использование типов по-прежнему приводит к ошибкам. Я понял в своем c_cpp_properties.json файл, который у меня был "databaseFilename": "" Это используется для "сгенерированной базы данных символов", но не было правильно настроено. Я установил это:

"databaseFilename": "${workspaceRoot}/.vscode/browse.vc.db"
  1. Перезапустите код Visual Studio

После выхода и перезапуска кода Visual Studio объявления не приводят к ошибке, а при наведении курсора на переменную отображает соответствующий тип.

Другие вопросы по тегам