C/C++;Visual Studio代码、gcc、Mac的扩展名;变量uint32“t不是类型名”;
我已经开始在Mac上为我的嵌入式C项目使用VSC和gcc for ARM。在C/C++;Visual Studio代码、gcc、Mac的扩展名;变量uint32“t不是类型名”;,c,gcc,visual-studio-code,C,Gcc,Visual Studio Code,我已经开始在Mac上为我的嵌入式C项目使用VSC和gcc for ARM。在c\u cpp\u properties.json中设置了include路径后,我的大部分#include现在都可以工作了。然而,像这样的一行: uint32_t m_ttff_seconds = 0; 生成一条红色的扭曲下划线,错误如下: variable uint32_t is not a type name 所讨论的源文件包括stdint: #include <stdint.h> 以及: (唯一的
c\u cpp\u properties.json中设置了include路径后,我的大部分#include
现在都可以工作了。然而,像这样的一行:
uint32_t m_ttff_seconds = 0;
生成一条红色的扭曲下划线,错误如下:
variable uint32_t is not a type name
所讨论的源文件包括stdint:
#include <stdint.h>
以及:
(唯一的其他选项是msvc-x64
)
当我使用make和gcc时,代码库编译得很好。如何显示uint32\t
所在的C/C++扩展
编辑:
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
这表明在VSC解析我的代码时没有定义\uuuuuuuint32\uuuuuuuuuuu类型
,但在使用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_托管的
,因此,stdint-gcc.h
实际上没有被包括在内。相反,该标题执行一个“include_next
”,它查找gcc-arm-none-eabi-4_9-2015q3/arm-none-eabi/include/stdint.h
。我仍然看不到unint32\t是在哪里定义的,无论是对于gcc和make还是对于VSC。我已经能够在我的机器(Windows)上解决这个问题,只需三个步骤:
将编译器定义应用于C/C++扩展
这个问题是正确的,它指出“这表明VSC在解析我的代码时没有定义\uuuuuuuuint32\uuuuuuuuuuu类型
,但它是在我使用make和gcc构建时定义的。”ARM交叉编译器有许多内置定义,这些定义不包括在clang-x64解析器中
首先,使用-dM-E
选项找出gcc编译器定义的定义。在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\u cpp\u properties.json
文件中。请注意,如果#define设置了一个值,则需要在此处使用=
符号。(您可以根据需要添加单独的定义,但我使用Excel根据需要对其进行格式化和排序。第一个定义用于我的项目,与我的Makefile中的定义相匹配。)
设置符号数据库
在对单个定义做了一些实验之后,我可以看到定义在stdint gcc.h
中被处理,任何类型的使用仍然会产生错误。我在我的c\u cpp\u properties.json
文件中意识到我有的“databaseFilename”:“
这用于“生成的符号数据库”,但配置不正确。我将其设置为:
"databaseFilename": "${workspaceRoot}/.vscode/browse.vc.db"
重新启动Visual Studio代码
退出VisualStudio代码并重新启动后,声明不会导致错误,当在一个变量上徘徊时,它显示适当的类型。
< P>在尝试所有建议的解决方案都没有效果之后,我认为UIT32 32的问题是一个bug。
要解决VSCode中恼人的警告,只需在#include部分后添加以下行:
typedef __uint32_t uint32_t;
在一个文件中执行一次,它修复了我的VSCODER警告,仍然编译。< /P>这是C还是C++?另外,您使用的是什么版本的Visual Studio?C.Visual Studio代码。路径中“../include”之后是否会缺少某些内容?否,这就是stdint.h和stdint gcc.h的位置。不确定发生了什么,但您可以使用typedef来克服限制,而不管如何,都应该定义studit。至少从VS10开始,C/C++编译器(
cl.exe
)知道什么是stdint.h
,什么是uint32_t
,没有更多。Visual Studio代码与Visual Studio不同,不包括编译器或头。如果同时安装了VisualStudio,它可以使用它们,但在为嵌入式ARM处理器开发时,使用这些编译器和头是错误的。对arm none eabi gcc
的引用适用于GNU arm工具链。Visual Studio代码中的解析器必须知道在哪里可以找到这些头,以及编译器使用的内置定义。在问题中,@eliot更改了包含路径,以便VSCode解析器可以找到正确的ARM头。但是,如果没有至少一些定义,则未正确处理标题,导致uint32\t
定义不正确。请注意,他也在Mac电脑上,而Mac电脑上没有Microsoft编译器,尽管默认情况下,默认值似乎指向等效系统头应该位于的位置。@mbmcavoy感谢您提供了非常详细的信息,但我已经非常仔细地关注了这一点,仍然看到了uint32\t上的错误。我只使用了定义的一个子集,但我想我已经涵盖了所有的单元内容。有什么想法吗?@eliot当我第一次这样做的时候,我认为我只是手动输入了我需要的,而且它工作了,但是我在回溯我的步骤进行完整的编写,发现它没有。中间头文件(stdint.hx2等)有许多#ifdef
指令,因此我认为如果没有它们,它甚至无法到达stdint gcc.h。跟踪每一个并手动输入是可能的,但很容易加载它们:转储到文件;删除前导“#定义”;如果有空格,用等号替换第一个;粘贴到设置中。
#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)
"defines": [
"STM32F415xx",
"USE_FULL_LL_DRIVER",
"__USES_INITFINI__",
"__ACCUM_EPSILON__=0x1P-15K",
"__ACCUM_FBIT__=15",
(...)
"__UINT32_TYPE__=long unsigned int",
(etc.)
"databaseFilename": "${workspaceRoot}/.vscode/browse.vc.db"
typedef __uint32_t uint32_t;