Расширение 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), выполнив три шага:
- Применение определений компилятора к расширению 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.)
- Настройка базы данных символов
Проведя несколько экспериментов с отдельными определениями, я увидел, что определение обрабатывается в stdint-gcc.h
Любое использование типов по-прежнему приводит к ошибкам. Я понял в своем c_cpp_properties.json
файл, который у меня был "databaseFilename": ""
Это используется для "сгенерированной базы данных символов", но не было правильно настроено. Я установил это:
"databaseFilename": "${workspaceRoot}/.vscode/browse.vc.db"
- Перезапустите код Visual Studio
После выхода и перезапуска кода Visual Studio объявления не приводят к ошибке, а при наведении курсора на переменную отображает соответствующий тип.