ARM CC编译错误和警告解释大全(1) 序列号0-1000

        

0未知错误

1文件的最后一行结束,没有换行符

2文件的最后一行以反斜杠结尾

3#include 文件<实体>包括自身

4内存不足

5无法打开<实体>输入文件<文件名>:<原因>

例如:

#include 

结果显示以下消息:

Error: #5: cannot open source input file "file.h": No such file or directory

因为 file.h 在系统包含目录中不存在。

6文件末尾未关闭的注释

注释以 /* 开头,但没有匹配的 */ 以关闭注释。

7无法识别的令牌

8缺少收盘报价

例如:

char foo[] = {"\"};

在此示例中,反斜杠导致将以下引号  视为文本字符,而不是关闭字符串。若要解决此问题,请使用:

char foo[] = {"\\"};

9不允许嵌套注释

例如:

/*nested
/*comment*/

10“#”此处不适用

11无法识别的预处理指令

例如:

#foo

12在上一个语法错误后,解析在此处重新启动

13需要文件名

例如:

#include <>

14预处理指令预期结束后的额外文本

例如:

#if EMBEDDED foo

艺术

#include  foo

艺术

#ifdef SOMETHING
:
#endif SOMETHING

#endif 不期望或不需要任何论据。将该行的尾部括在注释中可解决此问题:

#endif /* SOMETHING */

16 不是有效的源文件名

17预期为“]”

18预期为“)”

19预期数字结尾后的额外文本

例如:

int a = 37r;

20标识符<实体>未定义

例如,当针对 C++ 编译时,代码:

void foo( arg ) { }

结果显示以下消息:

Error: #20: identifier  is undefined

另一个可能导致此错误的代码示例是:

int foo(void)
{
  int a = 4;
  a = i;
}

这将导致以下消息:

Error: #20: identifier "i" is undefined

因为我没有被宣布。

21类型限定符在此声明中毫无意义

22十六进制数无效

23整数常量过大

24无效的八进制数字

例如:

int a = 0378;

25带引号的字符串应至少包含一个字符

例如:

char a ='';

26字符常量中的字符过多

例如,以下代码会生成此警告,因为多字节字符包含的字节数超出了 int 的容量:

int a ='abcde';

27字符值超出范围

当十六进制常量描述的字符值太大而无法在 char 变量中表示时,可能会发生此错误,例如:

char x = '\x100';

28表达式必须有一个常量值

29期待一个表情

30浮动常数超出范围

31表达式必须具有整型

32表达式必须具有算术类型

33应为行号

34行号无效

35#error 指令:<实体>

36缺少此指令的 #if

37缺少此指令的 #endif

打开的 #if 仍处于活动状态,但在文件结束前未 #endif 关闭。

38指令是不允许的 -- #else 已经出现

39除以零

40需要标识符

如果预处理器语句的格式不正确,例如,缺少必须紧跟在 #define 预处理器命令后面的标识符,则会引发此错误。

当代码使用关键字作为标识符时,也会发生此错误,例如:

int if =0;

41表达式必须具有算术或指针类型

42操作数类型不兼容(

44表达式必须有指针类型

45#undef 不得用于此预定义名称

46 是预定义的;尝试的重新定义被忽略

47不兼容的宏<实体>的重新定义

一个宏被定义了两次,具有不同的替换字符串。

例如:

#define TEST 0
#define TEST 1

使编译器生成:

Warning: #47-D: incompatible redefinition of macro "TEST" (declared at line 1)

如果需要执行此操作,请在第二个定义之前使用 #undef 取消定义宏。

如果要定义宏,除非它已经有定义,否则可以使用条件预处理,例如:

#ifndef TEST
#define TEST 0
#endif

使用 armcc -c foo.c 编译此内容将 TEST 定义为 0(默认值)。

使用 armcc -c -DTEST=1 编译此内容,foo.c 将 TEST 定义为 1。

49:重复的宏参数名称

50:“##”在宏定义中可能不是第一个

51:“##”在宏定义中可能不是最后一个

52:应为宏参数名称

53预期为“:”

54调用<实体时的参数太少>

55调用<实体的参数太多>

56sizeof 的操作数可能不是函数

57常量表达式中不允许使用此运算符

58预处理表达式中不允许使用此运算符

59常量表达式中不允许调用函数

60整数常量表达式中不允许使用此运算符

61整数运算结果超出范围

62班次计数为负数

63班次数过大

64声明不声明任何内容

例如:

int; 

65应为“;”

66枚举值超出“int”范围

枚举常量超出有符号 int 的范围时,编译器会生成此诊断消息。

例如,在 C 模式下编译以下代码时,编译器会生成此警告:

typedef enum
{
  Bit31 = 0x80000000
} Bits;

注意

此说明适用于 RVCT 2.2 及更高版本。

C模式:

  • 生成警告,但编译器将常量提升为 unsigned

  • 开关 --strict 始终将此消息生成为错误。

C++ 模式:

  • 默认情况下,超出范围的常量会被提升为 unsigned 而不会发出警告,并且在使用 --strict 时也是如此

对于消息为错误的情况,请使用以下代码示例作为解决方法:

typedef enum
{
  Bit31 = (int)0x80000000
} Bits;

不再发生溢出,因此不会报告任何错误。

注意

Bit31 的值现在为负数,因为它是有符号的 int。

请参阅《armcc 用户指南》中的以下内容:

结构、联合、枚举和位域.

67应为“}”

68整数转换导致符号更改

该常量太大,无法用有符号的 long 表示,因此被赋予了无符号类型。

例:

long l = 2147483648;

69整数转换导致截断

70不允许输入不完整的类型

例:

typedef struct {
  unsigned char size;
  char string[];
} FOO;

如果不在结构中声明数组的大小,编译器就无法分配结构的大小。在 --gnu 和 --c99 模式下允许使用不完整的类型。

71sizeof 的操作数可能不是位字段

75\“*\” 的操作数必须是指针

76宏的参数为空

77此声明没有存储类或类型说明符

78参数声明可能没有初始值设定项

79预期类型说明符

表示可变参数函数的省略号(如 printf())必须至少跟在一个参数后面。例如,更改:

int foo( ... );

自:

int foo( int bar, ... ); 

80此处可能未指定存储类型

81不能指定多个存储类型

82存储类不是第一位的

83多次指定类型限定符

84类型说明符组合无效

类型名称或类型限定符不能与第二个类型名称或类型限定符在同一声明中使用。例如:

typedef int int;

85参数的存储类无效

86函数的存储类无效

87此处不得使用类型说明符

88不允许使用函数数组

89不允许使用虚空数组

90不允许函数返回函数

91不允许函数返回数组

92identifier-list 参数只能在函数定义中使用

93函数类型可能不是来自 typedef

94数组的大小必须大于零

仅当处于 --gnu 模式时才允许使用零大小的数组,例如:

char name[0];

请参阅《armcc 用户指南》中的以下内容:

  • GNU对C和C++语言的扩展.

95数组太大

数组或结构的最大大小限制为 4GB。

96一个翻译单元必须至少包含一个声明

97函数不能返回此类型的值

98数组中不能有此类型的元素

99这里的声明必须声明一个参数

100重复的参数名称

101 已在当前范围内声明

102枚举类型的正向声明不规范

103类太大

104结构或联合太大

数组或结构的最大大小限制为 4GB。

105位字段大小无效

位字段不得大于类型的大小。

例如,使用 --strict

struct X{
  int y:5000;
};

106位字段的类型无效

位字段必须具有整数类型。

例:

struct X{
  float x:5;
  float y:2;
};

107零长度位字段必须未命名

108长度为 1 的有符号位字段

109表观调用括号前的表达式必须具有(指向)函数类型

110需要定义或标记名称

111语句无法访问

112预期的“而”

114 被引用但未定义

115continue 语句只能在循环中使用

116break 语句只能在循环或开关中使用

例:

void foo(void){
  int a=0;
  continue;
}

艺术

void bar(void){
  int a=0;
  break;
}

117non-void 应该返回一个值

118void 函数不能返回值

119不允许转换为类型

120返回值类型与函数类型不匹配

121外壳标签只能在交换机内使用

122默认标签只能在交换机内使用

124此开关中已出现默认标签

125预期为“(”

126表达式必须是左值

127期待声明

128无法访问循环

129块范围函数只能有外部存储类

130应为“{”

131表达式必须具有指向类的指针类型

132表达式必须具有指向结构或联合类型的指针

133需要成员名称

134需要字段名称

135<实体>没有成员<实体>

136没有字段

137表达式必须是可修改的左值

138不允许取寄存器变量的地址

139不允许取位字段的地址

140函数调用中的参数过多

函数声明与早期函数原型中的参数数不匹配。

例:

extern void foo(int x);
void bar(void)
{
  foo(1,2);
}

141当 body 存在时,不允许使用未命名的原型参数

142表达式必须具有指向对象的指针类型

143程序太大或太复杂,无法编译

144<类型>的值不能用于初始化类型为 的实体

固定大小字符数组的初始化字符串与数组大小完全相同,没有留出终止 \0 的空间,例如:

char name[5] = "Hello";

name 数组最多可以容纳 5 个字符。Hello”不适合,因为 C 字符串始终以 null 结尾(例如,“Hello\0”)。编译器报告:

Error: #144: a value of type "const char [6]" cannot be used to initialize an entity of type "char [5]"

如果指针隐式转换非零 int,也会引发类似的错误。

例如:

void foo_func( void )
{
  char *foo=1;
}

结果显示以下消息:

#144: a value of type "int" cannot be used to initialize an entity of type "char *"

对于强制转换,可以使用 --loose_implicit_cast 开关来抑制此错误。

145 可能无法初始化

146初始值设定项值过多

147声明与<实体不相容>

以下不正确的 C 代码会导致所有模式下的错误。可以使用 --diag_warning 147 将其从错误降级为警告,或使用 --diag_suppress 147 完全禁止显示。

typedef enum { e } E;
typedef enum { f } F;
E g(void);
F g(void);

148 已初始化

149全局范围的声明可能没有此存储类

150不能将类型名称重新声明为参数

151不能将 typedef 名称重新声明为参数

152将非零整数转换为指针

153表达式必须具有类类型

154表达式必须具有结构或联合类型

155老式的赋值运算符

156老式的初始化程序

157表达式必须是整数常量表达式

158表达式必须是左值或函数指示符

159声明与先前的<实体不兼容>

160外部名称与<实体的外部名称冲突>

161无法识别的 #pragma

163 无法打开临时文件 <实体>

164临时文件目录名称过长 (

165函数调用中的参数太少

函数原型是用许多参数定义的,这些参数与函数调用中传递的参数数量不匹配。

例如:

extern void foo(int x);
void bar(void)
{
  foo();
}

166无效的浮动常量

167 <类型>的参数与<类型>的参数不兼容

168此处不允许使用函数类型

169期待声明

尝试使用 C 编译器而不是 C++ 编译器编译某些 C++ 头文件时,可能会发生这种情况。

170基础对象外部的指针点

171无效的类型转换

172外部/内部链接与先前声明冲突

编译器会抑制有关链接差异的错误,其中函数被隐式声明为 extern,然后重新声明为 static,除非使用 --strict 选项。例如:

extern void foo(void);
static void foo(void){}

173浮点值不适合所需的整数类型

174表达式无效

175下标超出范围

177 已声明但从未被引用

默认情况下,未使用的声明警告会针对以下情况给出:

  • 变量、typedef 和函数的局部(在函数中)声明。

  • 标签(始终在函数中)。

  • 顶级静态函数和静态变量。

--diag_suppress 177 选项禁止显示这些警告。

178应用于数组的“&”不起作用

179:“%”的右操作数为零

180参数与形式参数不兼容

181参数与对应的格式字符串转换不兼容

例如,使用 --strict 进行编译时,代码如下:

unsigned long foo = 0x1234;
printf("%08X", foo);

导致警告:

Warning: #181-D: argument is incompatible with corresponding format string conversion

为避免出现警告,可以按如下方式重写代码:

unsigned long foo = 0x1234;
printf("%0lX", foo);

或者:

unsigned int foo = 0x1234;
printf("%0X", foo);

%0X 可用于 charshort 或 int。将 lX 用于整数,即使 ints 和 longs 在 ARM 处理器上都是 32 位宽。

182无法打开源文件<实体>(搜索列表中没有目录)

183铸件类型必须是整体式的

184强制转换类型必须是算术或指针

185无法访问代码中的动态初始化

186符号整数与零的无意义比较

例如:

unsigned short foo;
if (foo<0) printf("This never happens");

发出警告,指出无符号值(例如 char 或 int)与零之间的比较结果始终为 false。

187在“==”可能有意的地方使用“=”

例如:

int main(void)
{
  int a;
  const int b =1;
  if (a=b);
}

如果 if 语句中的赋值是有意为之,则可以通过添加显式比较来避免出现警告。例如,将示例中的 if 语句更改为:

  if ((a=b)!=0);

188枚举类型与另一种类型混合

189写入 文件时出错

190无效的中间语言文件

191类型限定符对 cast 类型没有意义

C 规范指出,强制转换不会产生左值,因此强制转换为合格类型与强制转换为该类型的不合格版本具有相同的效果。此警告旨在通知您,尽管代码仍然合法,但类型限定符不起作用。该警告可通过 --diag_suppress 191 抑制。

例如:

val2 = (const float)val1;

相当于:

val2 = (float)val1;

192无法识别的字符转义序列

此错误通常与尝试使用非 ASCII 字符集(如 16 位 Unicode 字符)相关联。编译器支持多字节字符集,例如 Unicode。源文件根据该计算机的所选区域设置进行编译。可以使用转义处理(根据 Kernighan 和 Ritchie 的建议,第 A2.5.2 节)来对特定值进行编码。

例如:

char *p = "\x12\x34\x56\x78"; // 12 34 56 78

在字符和字符串转义中,如果 \ 后面的字符没有特殊含义,则转义的值是字符本身,例如,\s 与 s 相同,并给出警告。

193零用于未定义的预处理标识符

194应为 ASM 字符串

195必须对 ASM 函数进行原型设计

196ASM 函数可能没有省略号

219删除文件时出错<实体>

220整数值不适合所需的浮点类型

221浮点值不适合所需的浮点类型

222浮点运算结果超出范围

223函数<实体>隐式声明

这是在没有函数原型的情况下发生的常见警告。

例如:

void foo(void)
{
  printf("foo");
}

要解决此问题,请添加 #include < stdio.h> 以包含 printf() 的原型。

对于 ANSI C,可以使用 --diag_suppress 223 禁止显示此警告。这在 ANSI C 模式下编译旧式 C 时很有用。

224格式字符串需要额外的参数

225格式字符串在此参数之前结束

226格式字符串转换无效

227宏递归

228尾随逗号不规范

229bit 字段不能包含枚举类型的所有值

230位字段的非标准型

在严格的 ANSI C90 中,位字段允许的唯一类型是 int、signed int 和 unsigned int

例如:

struct X {
   char y:2;
};

231声明在函数外部不可见

232“void”的老式typedef被忽略了

233左操作数不是包含此字段的结构或并集

234指针不指向包含此字段的结构或并集

235变量 声明为永不完成的类型

236控制表达式是常数

237选择器表达式是常量

238参数说明符无效

239类声明外部的说明符无效

240声明中的重复说明符

241联合不允许有基类

242不允许使用多个访问控制说明符

243缺少类或结构定义

244限定名不是类 或其基类的成员

245非静态成员引用必须相对于特定对象

246非静态数据成员不能在其类之外定义

247<实体> 已定义

一个典型的例子是变量名称被多次使用。

在编译依赖于暂定声明的旧代码时,有时会发生这种情况。暂定声明允许将变量声明并初始化为单独的语句,例如:

int a;
int a = 1;

默认情况下,C 代码允许临时声明,但 C++ 代码会产生错误。

248不允许指针引用

249不允许引用引用

250不允许引用 void

251不允许使用引用数组

252引用<实体>需要初始值设定项

253预期为“,”

254不允许使用类型名称

当在表达式中直接使用 typedef 名称时,会发生这种情况,例如:

typedef int footype;
int x = footype; // reports Error: #254: type name is not allowed

若要解决此问题,请首先创建该类型的实例,例如,新类型的变量:

typedef int footype;
footype bar = 1;
int x = bar;

255不允许类型定义

256类型名称 的重新声明无效

257const 需要初始值设定项

258:“this”只能在非静态成员函数内部使用

259常量值未知

260缺少显式类型(假定为“int”)

261未指定访问控制(默认为<实体>)

262不是类或结构名称

263重复的基类名称

264无效的基类

265 无法访问

仅供C++,--diag_warning 265 选项将访问控制错误降级为警告。

例如:

class A { void f() {}; }; // private member
A a;
void g() { a.f(); } // erroneous access

结果显示以下消息:

Error: #265-D: function "A::f" is inaccessible

266<实体>模棱两可

267老式参数列表(不合时宜)

268声明可能不会出现在块中的可执行语句之后

269不允许转换为不可访问的基类

274未正确终止的宏调用

276name 后跟 “::” 必须是类或命名空间名称

277无效的好友声明

278 构造函数或析构函数不能返回值

279析构函数声明无效

280声明与其类同名的成员

281不允许使用全局范围限定符(前导“::”)

282全局范围没有<实体>

283不允许使用限定名称

 284不允许引用 NULL

285初始化为“<...>“不允许用于 类型的对象

286基类<类型>不明确

287派生类 包含类

288无法将指向基类 的指针转换为指向派生类 的指针 -- 基类是虚拟的

289构造函数 的实例与参数列表不匹配

290 的复制构造函数不明确

291

292 不是类 的非静态数据成员或基类

293不允许间接非虚拟基类

294无效的联合成员 -- 类<类型>具有不允许的成员函数

296无效使用非左值数组

297应为操作员

298不允许继承成员

299无法确定 的哪个实例

300指向绑定函数的指针只能用于调用该函数

301typedef 名称已声明(类型相同)

302 已定义

304没有 的实例与参数列表匹配

305函数返回类型声明中不允许类型定义

306默认参数不在参数列表的末尾

307重新定义默认参数

308 的多个实例与参数列表匹配:

309构造函数 的多个实例与参数列表匹配:

310 类型的默认参数与

311不能仅通过返回类型来重载函数

312不存在从的合适用户定义转换

314只有非静态成员函数可以是虚拟的

315对象具有与成员函数不兼容的类型限定符

316程序太大,无法编译(虚函数太多)

317返回类型与被覆盖的虚函数 不相同或协变>

318虚拟<实体>的覆盖不明确

319纯说明符 (“= 0”) 只允许在虚拟函数上使用

320格式不正确的纯说明符(只允许“= 0”)

321不允许使用数据成员初始值设定项

322不允许抽象类类型 的对象:

323不允许函数返回抽象类

324重复好友声明

325仅允许在函数声明上使用内联说明符

326不允许使用“内联”

327内联函数的存储类无效

328成员的存储类无效

329本地类成员<实体>需要定义

330<实体>无法访问

332类<类型>没有复制构造函数来复制 const 对象

333不允许定义隐式声明的成员函数

334类<类型>没有合适的复制构造函数

335不允许有联动规范

336未知的外部链接规格

337链接规范与以前的<实体不兼容>

如果使用与先前声明不兼容的规范重新声明函数的链接,则会产生此错误。

例如:

int foo(void);
int bar(void)
{
  int x;
  x = foo();
  return x;
}
extern "C" int foo(void)
{
  return 0;
}

结果显示以下消息:

Error: #337: linkage specification is incompatible with previous "foo" (declared at line 1)

338重载函数 的多个实例具有“C”链接

339class 具有多个默认构造函数

340值复制到临时,引用临时使用

341:“operator”必须是成员函数

342运算符不能是静态成员函数

343用户定义的转换不允许任何参数

344此运算符函数的参数过多

345此运算符函数的参数太少

346非成员运算符需要类类型的参数

347不允许使用默认参数

348的多个用户定义的转换适用:

349没有运算符 与这些操作数匹配

350多个运算符 匹配以下操作数:

351分配函数的第一个参数必须为“size_t”类型

352分配函数需要“void *”返回类型

353释放函数需要“void”返回类型

354释放函数的第一个参数必须为“void *”类型

356type 必须是对象类型

357基类<类型>已初始化

358需要基类名称 -- 假定<类型>(不合时宜)

359 已初始化

360缺少成员或基类的名称

361分配给“这个”(不合时宜)

362使用“重载”关键字(不合时宜)

363无效的匿名联盟 -- 不允许非公开成员

364匿名联合无效 -- 不允许成员函数

365全局或命名空间范围的匿名联合必须声明为静态

366 不提供以下初始值设定项:

367 的隐式生成的构造函数无法初始化:

368 未定义用于初始化以下内容的构造函数:

这表示您有一个 const 结构或一个包含 const 的结构。它作为友好警告发出,以帮助解决错误 369。如果结构的 const 成员已正确初始化,则可以安全地忽略这一点。

369 具有未初始化的 const 或引用成员

这表示您有一个 const 结构的实例或一个包含尚未正确初始化的 const 的结构。您必须为每个实例正确初始化它,或者提供构造函数来初始化它。

370 具有未初始化的 const 字段

371类<类型>没有用于复制 const 对象的赋值运算符

372class 没有合适的赋值运算符

373 的不明确赋值运算符

375声明需要 typedef 名称

377不允许使用“虚拟”

378:“静态”是不允许

379将绑定函数转换为正常函数指针(不合时宜)

380表达式必须具有指向成员类型的指针

381extra “;” 忽略

在 C 中,这可能是由声明行末尾的意外分号引起的,例如:

int x;;

使用宏时,可能会无意中发生这种情况。

同样,在 C++ 中,这可能是由以下结构引起的:

class X { ... } ; ;

这可能是由于某些宏用法导致的,例如:

#define M(c) class c { ... } ;
M(X);

额外的分号是非法的,因为空声明是非法的。

382静态成员的类内初始值设定项是非标准的

384没有重载 的实例与参数列表匹配

386没有<实体>实例与所需类型匹配

387删除使用的数组大小表达式(不合时宜)

389不允许强制转换为抽象类

390函数“main”不得调用或获取其地址

391不能为数组指定 new-initializer

392成员函数<实体>不能在其类之外重新声明

393不允许指针指向不完整的类类型

394不允许引用封闭函数的局部变量

395用于后缀<实体>的单参数函数(不合时宜)

397隐式生成的赋值运算符无法复制:

398转换为数组类型是非标准的(被视为转换为<类型>)

399 有一个运算符 new(),但没有默认运算符 delete()

400 有一个默认运算符 delete(),但没有运算符 new()

401基类 的析构函数不是虚拟

403成员<实体的重新声明无效>

404函数“main”不能以内联方式声明

405与其类同名的成员函数必须是构造函数

406使用嵌套<实体>(不合时宜)

407析构函数可能没有参数

408 的复制构造函数可能没有 类型的参数

409 返回不完整的类型

410无法通过<类型>指针或对象访问受保护的<实体>

411不允许使用参数

412此处不允许使用“ASM”声明

413不存在从的合适转换函数

414删除指向未完成类的指针

415没有合适的构造函数将 转换为

416多个构造函数适用于 转换为

417从<类型>到<类型>的多个转换函数适用: 

418从<类型>到内置类型的多个转换函数适用:

424构造函数或析构函数的地址可能没有被占用

426临时用于引用非常量(不合时宜)的初始值

427会员声明中不允许使用限定名称

428枚举类型与另一种类型混合(不合时宜)

429:“new”中数组的大小必须为非负数

430返回对本地临时的引用

432不允许使用“枚举”声明

433类型<类型>绑定引用中的限定符删除到 <类型>

434不能使用类型 的值初始化类型为 的引用(非常量限定)。

435不能删除指向函数的指针

436转换函数必须是非静态成员函数

437此处不允许使用模板声明

438期待“<”

439期待“>”

440缺少模板参数声明

441缺少的参数列表

442<实体的论据太少>

443<实体的论据太多>

445%n1 不用于声明 %n2 的参数类型

446两个嵌套类型具有相同的名称:%no1 和 %nod2(前端兼容性)

447在嵌套 %nod2 之后声明全局 %NO1(前端兼容性)

449%n 的多个实例与所需类型匹配

450:“长”型非标

451省略<实体>是不标准的

452不能在转换函数上指定返回类型

456实例化

457 不是函数或静态数据成员

458 类型的参数与 类型的模板参数不兼容

459不允许需要临时或转换的初始化

460声明<实体>隐藏函数参数

461引用非常量的初始值必须为左值

463不允许使用“模板”

464 不是类模板

466:“main”不是函数模板的有效名称

467对<实体>引用无效(联合/非联合不匹配)

468模板参数不能引用本地类型

469标记类型的<实体>与<实体的声明不兼容>

470全局范围没有名为 的标记

471 没有名为

472成员函数 typedef(允许 cfront 兼容性)

473 只能用于指向成员的指针声明

475模板参数不能引用非外部实体

476name 后跟“::~”必须是类名或类型名

478用作析构函数名称的类型与类型 不匹配

479 在被调用后重新声明为“内联”

481模板声明的存储类无效

482%nd 是不可访问的类型(允许 cfront 兼容性)

484无效的显式实例化声明

485 不是可以实例化的实体

486编译器生成的<实体>无法显式实例化

487内联<实体>无法显式实例化

489%n 无法实例化 -- 未提供模板定义

490 无法实例化 -- 它已被显式专用化

493没有 %n 的实例与指定的类型匹配

494使用 typedef 声明 void 参数列表是不标准的

当编译器未处于 C99 模式时,此错误由函数声明 f(V) 生成,其中 V 是 void 类型。

仅在 C99 模式下允许使用作为 typedef 的参数来表示函数没有参数。

495使用全局 %n1 代替 %n2(前端兼容性)

496模板参数<实体>不能在此范围内重新声明

497声明<实体>隐藏模板参数

498模板参数列表必须与参数列表匹配

500后缀 \“operator%s\” 的额外参数必须为 \“int\” 类型

501必须将运算符名称声明为函数

502不允许使用操作员名称

503<实体>不能在当前范围内专门化

504用于获取成员函数地址的非标准形式

C++ 标准要求使用限定符和 & 字符(例如 &A::f)命名指向成员的指针。

505模板参数太少 -- 与之前的声明不匹配(声明<实体>)

506模板参数过多 -- 与之前的声明不匹配(声明<实体>)

507不允许使用运算符 delete(void *) 的函数模板

508类模板和模板参数的名称可能不同

510模板参数不能引用未命名的类型

511对枚举类型的此操作需要适用的用户定义运算符函数

512不允许在引用类型上使用类型限定符

513不能将 类型的值分配给 类型的实体

514符号整数与负常数的无意义比较

515无法转换为不完整的类<类型>

516const 对象需要初始值设定项

517对象具有未初始化的常量或引用成员

518非标准预处理指令

519 可能没有模板参数列表

520使用“<...聚合对象应为 >”

521指向成员的指针选择类类型不兼容(

第522 毫无意义的好友声明

523\“.\” 代替 \“::\” 以形成限定名称

524const 对象调用非常量函数(不合时宜)

525从属语句不能是声明

526参数可能没有 void 类型

例如:

void foo(void a) { }

529模板参数表达式中不允许使用此运算符

530try 块至少需要一个处理程序

531处理程序需要异常声明

532处理程序被默认处理程序屏蔽

533处理程序可能被类型 的上一个处理程序屏蔽

534使用本地类型指定异常

535异常规范中的冗余类型

536异常规范与以前的<实体的异常规范不兼容>

540禁用对异常处理的支持;使用 --exceptions 启用

541允许所有例外与以前的<实体不兼容>

542 无法创建实例化请求文件

543非类型模板参数中不允许非算术运算

544使用局部类型声明非局部变量

545使用局部类型声明函数

546控制权的转移绕过了以下各项的初始化:

例:

int main(void){
   int choice = 1;
   int z =1;
   switch(choice)
   {
     case 1:
       int y = 1;
       z = y + z;
       break;
     case 2:
     break;
   }
   return 0;

在此示例中,y 是一个初始化的变量,该变量在作用域内,但在其他情况下未使用。从 switch 语句的条件到大小写标签的传输绕过 y 的初始化,与 C++ 标准冲突。

解决此问题的常用方法是将声明 y 的大小写括在大括号中。以下代码将 y 的范围限制为情况 1,因此尝试在其他地方使用它会导致错误:

case 1:   {
  int y = 1;
  z = y + z;
}
break;

由于 y 是普通旧数据 (POD) 类型,因此另一种方法是不使用初始化:

case 1:
 int y;
 y = 1;
 z = y + z;
 break;

这种方法的缺点是,如果案例 1 之外的代码使用 y,并且意外地期望它具有在案例 1 中分配的值,则不会发出警告。

548将控制权转移到异常处理程序

549 在设置其值之前使用

550 已设置但从未使用

551<实体>不能在当前范围内定义

552不允许异常规范

553<实体的外部/内部联系冲突>

554 不会被调用进行隐式或显式转换

555 的标记类型与类型为 的模板参数不兼容

556不允许使用运算符 new(size_t) 的函数模板

558不允许指向类型 的成员的指针

559算子函数参数列表中不允许使用省略号

560 保留供将来用作关键字

561无效的宏定义:

562无效的宏未定义:

563无效<实体>输出文件<文件名>

564无法打开<实体>输出文件<文件名>:<原因>

565如果输入为

570调试选项参数出错

571无效选项:

572后端需要 IL 文件的名称

573无法打开IL文件

574无效号码:

575主机 CPU ID 不正确

576无效的实例化模式:

578无效的错误限制:

585虚函数表只能在编译 C++ 时禁止显示

586不合时宜选项只能在编译 C++ 时使用

587实例化模式选项只能在编译 C++ 时使用

588自动实例化模式只能在编译 C++ 时使用

589隐式模板包含模式只能在编译 C++ 时使用

590异常处理选项只能在编译 C++ 时使用

591严格模式与K&R模式不兼容

592严格模式与 cfront 模式不兼容

593缺少源文件名

594编译多个输入文件时,可能无法指定输出文件

595命令行上的参数过多

596指定了输出文件,但不需要任何输出文件

597IL 显示需要 IL 文件的名称

598模板参数可能没有 void 类型

599由于全部实例化模式,%n 的递归实例化过多

600严格模式与允许不合时宜不兼容

601抛出表达式可能没有 void 类型

602本地实例化模式与自动实例化不兼容

603不允许使用抽象类类型 的参数:

604不允许使用抽象类 的数组:

605浮点模板参数不标准

606此编译指示必须紧接在声明之前

607此编译指示必须紧接在声明之前

608此编译指示必须紧接在声明或声明之前

609这里不能使用这种杂注

611重载的虚函数<实体>在<实体中仅部分覆盖>

612内联模板函数的具体定义必须在首次使用之前进行

613诊断控制选项中的错误标记无效:

614诊断控制选项中的错误号无效:

615参数类型涉及指向未知边界数组的指针

616参数类型涉及对未知边界数组的引用

617指向成员函数的指针强制转换为指向函数的指针

618struct 或 union 声明没有指定成员

619非标准未命名字段

620非标准未命名成员

624 不是类型名称

625无法打开预编译的头输入文件

626预编译头文件 无效或不是由此版本的编译器生成的

627此目录中未生成预编译头文件

628用于生成预编译头文件<实体>的头文件已更改

629 命令行选项与创建预编译头文件 时使用的选项不匹配

630预處指令的初始領序與預訂頭討文件的初始頻序不相容

631无法获取<实体>的映射内存:<原因>

如果尝试使用大型预编译标头 (PCH),并且对 ARM 编译器工具链使用的 TMP 目录有大小限制,则可能会发生这种情况。一种可能的解决方法是删除 TMP 环境变量。这将强制工具在当前工作目录中创建临时文件。

请参阅《入门指南》中的以下内容:

临时文件目录的 TMP 和 TMPDIR 环境变量.

请参阅《armcc 用户指南》中的以下内容:

预编译头 (PCH) 文件.

632:“”:使用预编译的头文件“

633:“”:创建预编译头文件“

634内存使用与预编译头文件冲突<实体>

如果由于编译器地址空间的必需部分不可用而无法将 PCH 文件映射回生成,则可能会发生这种情况。

另请参阅错误 631

635PCH 内存大小无效

636PCH 选项必须首先出现在命令行中

637PCH 内存分配内存不足

638编译多个输入文件时,不得使用预编译头文件

639预分配内存不足,无法生成预编译头文件(需要<实体>字节)

640 程序中非常大的实体阻止生成预编译的头文件

641 不是有效的目录

642无法生成临时文件名

643:“限制”是不允许

644针或对函数类型的引用不能由“限制”限定

646此处可能未指定调用约定修饰符

647冲突的调用约定修饰符

648严格模式与 Microsoft 模式不兼容

649前端模式与 Microsoft 模式不兼容

650此处指定的调用约定将被忽略

651嵌套声明器不得遵循调用约定

652此类型忽略调用约定

654声明修饰符与先前的声明不兼容

655此声明中不允许使用修饰符<实体>

656将控制权转移到 try 块中

657内联规范与以前的<实体不兼容>

658找不到模板定义的右大括号

659wchar_t 关键字选项只能在编译C++时使用

660无效的包装对齐值

661预期为整数常量

662纯虚函数的调用

正在调用纯虚函数,例如:

struct T { T(); virtual void pvfn() = 0; };
                   // a pure virtual function
T::T() { pvfn(); } // warning given here

默认情况下,调用纯虚函数会导致:

  1. 调用库函数 __cxa_pure_virtual()

  2. __cxa_pure_virtual() 函数引发信号 SIGPVFN

  3. 信号被default_signal_handler捕获

  4. 显示使用半托管在控制台上调用的纯虚拟 fn 的处理程序。

请参阅《armcc 用户指南》中的以下内容:

调用纯虚函数.

663源文件标识符字符串无效

664 不能在友元声明中定义类模板

665:“ASM”是不允许的

666:“ASM”必须与函数定义一起使用

667:“ASM”功能不标准

668没有显式参数的省略号是非标准的

669:“&...”是非标准的

670无效使用“&...”

672临时用于引用常量易失性(不合时宜)的初始值

673 >类型的引用不能用 类型的值进行初始化

674引用 const volatile 的初始值必须为 lValue。

675SVR4 C 兼容性选项只能在编译 ANSI C 时使用

676使用超出范围的 <实体声明>

677严格模式与SVR4 C模式不兼容

678不能内联调用<实体>

679<实体>不能内联

680无效的 PCH 目录:

681预期__except或__finally

682__leave声明只能在__try内使用

688<实体>在包对齐堆栈上找不到

689空包装对齐堆栈

690RTTI 选项只能在编译 C++ 时使用

691 是无法访问的,这是已删除的副本所必需的

692(已消除的复制所必需)不可调用,因为引用参数无法绑定到 rValue

在使用 typeid 之前,必须包含 693

694 不能放弃 const 或其他类型的限定符

695dynamic_cast中的类型必须是指向完整类类型的指针或引用,或者是 void *

696指针dynamic_cast的操作数必须是指向完整类类型的指针

697引用dynamic_cast的操作数必须是完全类类型的左值

698运行时dynamic_cast的操作数必须具有多态类类型

699bool 选项只能在编译 C++ 时使用

701此处不允许使用数组类型

702应为“=”

703条件声明中的预期声明符

704,在条件中声明,不得在此范围内重新声明

705函数模板不允许使用默认模板参数

706应为“”或“>”

707需要模板参数列表

708不推荐使用递增布尔值

709不允许使用布尔类型

710 类 > 内基类 的偏移量过大

711表达式必须具有 bool 类型(或可转换为 bool)

712数组 new 和 delete 选项只能在编译 C++ 时使用

713 不是变量名称

此处不允许使用 714__based 修饰符

715__based 不在指针运算符之前,__based忽略

716修饰符中的变量必须具有指针类型__based

717const_cast中的类型必须是指向对象类型的成员的指针、引用或指针

718A const_cast只能调整类型限定符;它不能更改基础类型

719不允许可变

720<实体>的重新声明不得改变其访问权限

722使用替代令牌“<:”似乎是无意的

723使用替代令牌“%:”似乎是无意的

724不允许定义命名空间

725name 必须是命名空间名称

726不允许使用命名空间别名定义

727命名空间限定的名称是必需的

728不允许使用命名空间名称

729DLL 属性组合无效

730 不是类模板

731元素类型不完整的数组是非标准的

732分配运算符不能在命名空间中声明

733不能在命名空间中声明释放运算符

734<实体>与<实体的使用声明冲突>

735使用<实体的声明>与<实体冲突>

736命名空间选项只能在编译 C++ 时使用

737using-declaration 忽略 -- 它指的是当前命名空间

738需要类限定名称

742%n 没有实际成员 %sq

744指定不兼容的内存属性

745忽略内存属性

746内存属性后面可能没有嵌套的声明符

747多次指定内存属性

748多次指定的调用约定

749不允许使用类型限定符

750 在声明其模板之前使用

751不能重载具有相同参数类型的静态和非静态成员函数

752没有事先声明<实体>

753不允许使用模板 ID

754不允许使用类限定名称

755<实体>不得在当前范围内重新声明

756命名空间成员声明中不允许使用限定名

757 不是类型名称

758当前作用域中不允许显式实例化

759 无法在当前作用域中显式实例

760 显式实例化了不止一次

761typename 只能在模板中使用

762special_subscript_cost 选项只能在编译C++时使用

763typename 选项只能在编译 C++ 时使用

764隐式类型名称选项只能在编译 C++ 时使用

765类对象宏定义开头的非标准字符

766虚拟<实体>的异常规范与覆盖的<实体的异常规范不兼容>

767从指针到较小整数的转换

768隐式声明的虚拟<实体>的异常规范与被覆盖的<实体的异常规范不兼容>

769,隐式调用自 p2,是模棱两可的

770选项“显式”只能在编译 C++ 时使用

771:“显式”是不允许

772声明与 (保留类名)冲突

773只允许使用“()”作为数组<实体的初始值设定项>

774函数模板声明中不允许使用“虚拟”

775无效的匿名联合 -- 不允许使用类成员模板

776模板嵌套深度与之前的

777此声明不能有多个“模板<...>“条款

778控制 for-init 范围的选项只能在编译 C++ 时使用

在 for 循环初始化中声明的 779 不能在此作用域中重新声明

780引用是<实体> -- 在旧的 for-init 作用域规则下,它应该是

781控制 for-init 差异警告的选项只能在编译 C++ 时使用

782这里需要虚拟<实体>的定义

783空注释被解释为标记粘贴运算符“##”

784好友声明中不允许使用存储类

785此声明中不允许<实体>的模板参数列表

786 不是有效的成员类或函数模板

787无效的成员类或函数模板声明

788包含模板参数列表的模板声明后不能跟显式专用化声明

789<实体>的明确专业化必须在首次使用<实体之前进行>

790当前范围内不允许显式专业化

791不允许对<实体>进行部分专业化

792不是一个可以明确专门化的实体

793<实体>的明确专业化必须在首次使用之前

794模板参数<实体>不能用于详述的类型说明符

795特殊化<实体>需要“模板<>”语法

798选项“old_specializations”只能在编译C++时使用

799专门化<实体>没有“模板<>”语法是不标准的

800此声明可能没有外部“C”联动

801 不是当前作用域中的类或函数模板名称

802在重新声明未引用的函数模板时指定默认参数是非标准的

803不允许在重新声明已引用的函数模板时指定默认参数

804无法将指向基类成员 的指针转换为指向派生类 成员的指针 -- 基类是虚拟的

805异常规范与 不兼容

806允许所有例外与 <实体不兼容>

807默认参数表达式意外结束

808不允许对引用进行默认初始化

809未初始化的具有 const 成员

810未初始化的基类 具有 const 成员

811const 需要初始值设定项 -- 类 没有用户提供的默认构造函数

812const 对象需要初始值设定项 -- 类 没有用户提供的默认构造函数

813选项“implicit_extern_c_type_conversion”只能在编译C++时使用

814严格模式与长保留规则不兼容

815返回类型的类型限定符无意义

例如:

__packed void foo( void ) { }

忽略 __packed 限定符,因为无法__packed返回类型。

816在函数定义中,不允许在“void”返回类型上使用类型限定符

817此类中不允许使用静态数据成员声明

818模板实例化导致函数声明无效

819“......”是不允许的

 820选项“extern_inline”只能在编译C++时使用

821外部内联<实体>被引用但未定义

822 类型 的析构函数名称无效

824析构函数引用不明确 -- 可以使用

825虚拟内联<实体>从未定义

826 从未被引用

827构造函数初始值设定项列表中只能指定一个联合成员

828禁用对“new[]”和“delete[]”的支持

829:“double”用于生成的 C 代码中的“long double”

830 没有相应的运算符 delete(如果在初始化已分配对象期间引发异常,则调用)

831对放置删除的支持已禁用

832没有可见的适当运算符删除

833不允许指针或引用不完整的类型

834无效的部分专用化 -- <实体>已完全专用

835不兼容的异常规范

836返回对局部变量的引用

837省略显式类型是非标准的(假定为“int”)

已声明或定义没有返回类型的函数。

示例,代码如下:

foo(void){
    int a;
}

假定为 int 结果。

如果希望它不返回任何结果,请使用 void 作为返回类型。这在旧式 C 中很普遍。

--diag_suppress 837 选项禁止显示此警告。

另请参阅消息编号 938,这是 main() 此消息的特例。

838多个部分专用化与

840在主模板的声明中不允许使用模板参数列表

841部分专用化可能没有默认的模板参数

8421 未用于或无法从

844部分专用化的模板参数列表包括一个非类型参数,其类型取决于模板参数

845此部分专用化将用于实例化<实体>

846这种部分特殊化会使<实体>的实例化变得模棱两可

847表达式必须具有整数或枚举类型

848表达式必须具有算术或枚举类型

849表达式必须具有算术、枚举或指针类型

850铸件类型必须为积分或枚举

851强制转换类型必须为算术、枚举或指针

852表达式必须是指向完整对象类型的指针

854部分专用化非类型参数必须是非类型参数的名称或常量

855 返回类型与被覆盖的虚函数 的返回类型  不同

856选项“guiding_decls”只能在编译C++时使用

857类模板的部分专用化必须在它所属的命名空间中声明

858 是一个纯虚函数

859纯虚拟<实体>没有超凡者

忽略 860__declspec 属性

861输入行中的字符无效

862函数返回不完整类型

863此“#pragma 包”指令的效力是<实体的本地>

864<实体>不是模板

865好友声明不得声明部分专业化

866忽略异常规范

867:“size_t”的声明与预期的类型 不匹配

868嵌套模板参数列表的相邻“>”分隔符之间所需的空间(“>>”是右移位运算符)

869 无法设置区域设置<实体>以允许处理多字节字符

870无效的多字节字符序列

871模板实例化导致意外的函数类型 (自模板声明以来,名称的含义可能已更改 -- 模板的类型为

872不明确的指导性声明 -- 多个函数模板 与类型 匹配

873非类型模板参数中不允许非整型运算

874选项“embedded_c++”只能在编译C++时使用

875嵌入式 C++ 不支持模板

876嵌入式 C++ 不支持异常处理

877嵌入式 C++ 不支持命名空间

878嵌入式 C++ 不支持运行时类型信息

879嵌入式 C++ 不支持新的强制转换语法

880嵌入式 C++ 不支持使用声明

881嵌入式 C++ 不支持“可变”

882嵌入式 C++ 不支持多重继承或虚拟继承

883无效的 Microsoft 版本号:

884已为 设置了指向成员表示的指针 >

885 不能用于指定

886积分常数上的后缀无效

887__uuidof操作数必须具有指定了 __declspec(uuid(\“...\”)) 的类或枚举类型

888__declspec(uuid(\“...\”)) 中的 GUID 字符串无效

889选项“vla”只能在编译 C 时使用

890不允许使用未指定边界的可变长度数组

891此声明中不允许使用显式模板参数列表

892具有链接的实体不能具有涉及可变长度数组的类型

893可变长度数组不能有静态存储持续时间

894<实体>不是模板

896预期为模板参数

898非成员运算符需要具有类或枚举类型的参数

899选项“enum_overloading”只能在编译C++时使用

901析构函数名称 %t1 的限定符与类型 %t2 不匹配

902类型限定符被忽略

903选项“nonstd_qualifier_deduction”只能在编译C++时使用

904声明为“dllimport\”的函数可能未定义

905属性规范不正确;正确的形式是 __declspec(property(get=name1,put=name2))

906属性已指定

907__declspec(property)不允许在此声明中使用

908成员是用 __declspec(property) 声明的,但没有指定 \“get\” 函数

909 缺少 __declspec(property) \“get\” 函数 %sq

910成员用 __declspec(property) 声明,但没有指定 \“put\” 函数

911 缺少 __declspec(property) \“put\” 函数 %sq

912模棱两可的类成员引用 -- 优先于

916无法将指向派生类 成员的指针转换为指向基类 成员的指针 -- 基类是虚拟的

917实例化文件的目录无效:

918选项“one_instantiation_per_object”只能在编译C++时使用

921编译多个输入文件时,不能指定实例化信息文件名

922编译多个输入文件时,不能使用选项“one_instantiation_per_object\”

923多个命令行选项与缩写“--”匹配:

925忽略函数类型的类型限定符

927迟到/早决选项只能在编译 C++ 时使用

928不正确地使用va_start

如果在 PATH 环境变量上引用了较旧的 ARM 工具,并且对于以下 ARM 环境变量,则可能会生成此错误:

  • ARMCONF
  • ARMDLL
  • ARMHOME
  • ARMINC
  • ARMLIB

删除这些环境变量以及 PATH 上对旧工具的任何引用,然后重复编译。

以下示例显示了 va_start() 的用法:

#include 
#include 

void error(char *fmt, ...)
{
        va_list args;

        va_start(args, fmt);
        vprintf(format, args);
        va_end(args);
}

929不正确地使用va_arg

930不正确地使用va_end

931挂起的实例化选项只能在编译 C++ 时使用

932#import 文件的目录无效:

933 导入目录只能在 Microsoft 模式下指定

934联合中不允许使用具有引用类型的成员

935:“typedef”此处可能未指定

936重新声明<实体>改变其访问权限

937类或命名空间限定名是必需

938在函数“main”的声明中省略了返回类型“int”

main() 已声明或定义,没有返回类型。

例如:

main(void){
  int a;
}

如果使用 --strict 编译,则编译器会报告为错误。

如果希望它不返回任何结果,请使用 void 作为返回类型。这在旧式 C 中很普遍。

对于 ANSI C,--diag_suppress 938 选项禁止显示此警告。

对于 C++,这总是会导致错误。

有关更一般的情况,另请参阅消息编号 837

939指向成员表示的指针 对于

940非无效<实体末尾缺少返回语句>

已为函数定义了返回类型,但未返回任何值。

例:

int foo(int a)
{
  printf("Hello %d", a);
}

941忽略<实体>的重复 using-declaration

942枚举位字段始终是无符号的,但枚举<类型>包括负枚举器

943选项“class_name_injection”只能在编译C++时使用

944选项“arg_dep_lookup”只能在编译C++时使用

945选项“friend_injection”只能在编译C++时使用

946“模板”后面的名称必须是模板

948非标准局部类友元声明 -- 封闭范围内没有事先声明

949在此声明中指定默认参数是非标准的

950选项“nonstd_using_decl”只能在编译C++时使用

951函数“main”的返回类型必须为“int”

952 非类型模板参数可能没有类类型

953 不能在类模板外部的类成员的声明中指定默认模板参数

954 在构造函数的函数 try 块的处理程序中不允许使用 return 语句

955普通指示符和扩展指示符不能组合在初始值设定项名称中

956第二个下标不得小于第一个下标

957选项“指示符”只能在编译 C 时使用 

958选项“extended_designators”只能在编译 C 时使用

959位字段的声明大小大于位字段类型的大小;截断为<实体>位

960用作构造函数名称的类型与类型 不匹配

961使用没有链接的类型来声明有链接的变量

962使用没有链接的类型来声明函数

963不能在构造函数上指定返回类型

964不能在析构函数上指定返回类型

965通用字符名称格式不正确

966通用字符名称指定无效字符

967通用字符名称不能指定基本字符集中的字符

968标识符中不允许使用此通用字符

969标识符__VA_ARGS__只能出现在可变参数宏的替换列表中

970忽略此好友声明上的限定符

971数组范围指示符不能应用于动态初始值设定项

972属性名称不能出现在此处

973忽略用作函数限定符的“内联”

974选项“compound_literals”只能在编译C时使用

975不允许使用可变长度的数组类型

976整数常量表达式中不允许使用复合文字

977不允许使用类型的复合文字

978 不能在本地类中声明模板友元声明

979模棱两可的“?”操作:类型的第二个操作数可以转换为第三个操作数类型,反之亦然

980调用类类型的对象,而没有适当的 operator() 或将函数转换为指向函数类型的指针

982多种方法可以调用类型的对象作为参数列表:

983typedef 名称已声明(类型相似)

984不能给予运算符 new 和运算符删除内部联动

985匿名联合不允许存储类“可变”

986预编译头文件无效

987不允许将抽象类类型 作为 catch 类型:

988 限定函数类型不能用于声明非成员函数或静态成员函数

989 限定函数类型不能用于声明参数

990无法创建指向限定函数类型的指针或引用

991额外的大括号是非标准的

992无效的宏定义:

在编译行中不正确地使用 -D,例如“-D##”

993指针类型的减法是不标准的

994模板模板参数声明中不允许有空的模板参数列表

995预期的“类”

996声明模板模板参数时必须使用“class”关键字

997隐藏了——虚拟功能覆盖有意吗?

998作为函数定义的友元声明不允许使用限定名

999

1000此处可能未指定存储类型

        

你可能感兴趣的:(单片机,嵌入式硬件)