C/C++;Visual Studio代码、gcc、Mac的扩展名;变量uint32“t不是类型名”;

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> 以及: (唯一的

我已经开始在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>
以及:

(唯一的其他选项是
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;