【发布时间】:2017-08-15 20:39:39
【问题描述】:
我已经开始在我的嵌入式 C 项目中使用 VSC,并在 Mac 上使用 gcc for ARM。在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 时,代码库编译得很好。如何显示 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
而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。
【问题讨论】:
-
这是 C 还是 C++?另外,您使用的是什么版本的 Visual Studio?
-
C. Visual Studio 代码。
-
路径中的“.../include”之后是否缺少某些内容?
-
不,这就是 stdint.h 和 stdint-gcc.h 所在的地方。
-
不确定发生了什么,但您可以使用 typedef 来解决这个限制
标签: c gcc visual-studio-code