ARMCC 中implicit cast of pointer to non-equal pointer的原因

本文记录了在使用ADS的C编译器过程中遇到的一个典型问题:在定义字符串数组时,由于指针类型不匹配导致的编译错误。通过调整指针类型,最终解决了编译错误。

ADS的C编译器真是有点啊。。

unsinged char *str="ifqif.qifqq";

这样的声明都不能自己转换一下啊。今天在声明一个字符串数组的时候总是报错。

unsigned char vga640480[] =
 {
  0x61,0x02,0x0b,0x00,0x20,0x37,0x10,0x8c,
  0x01,0x69,0x30,0x20,0x05,0x03,0x1b,0x15,
  0x00,0xcb,0xff,0x40,0x3f,0x7e,0x0d,0x40,
  0x62,0x00,0x68,0x00,0xf0,0x00,0x00,0x00,
  0x0a,0x01,0x00,0x00,0x01,0x32,0x00,0x00,
  0x00,0x00,0x54,0x01,0xae,0xae,0xd7,0x81,
  0x08,0xfa,0xfa,0x1f,0x0f,0xfa,0xfa,0x03,
  0xfc,0x00,0x00,0x0f,0x0f,0x00,0x00,0x3f
 };

unsigned char *(display_mode[2][2]) =
{
  {0, 0},
  {vga640480, "VGA 640X480"},

}

Error   : C3028E: '=': implicit cast of pointer to non-equal pointer
vga.c line 58  

最后改为

unsigned char *(display_mode[2][2]) =
{
  {0, 0},
  {vga640480, (unsigned char *)"VGA 640X480"},

}

编译通过。

真是死板的要命哈。

<think>好的,我现在需要帮助用户解决Keil ARMCC编译器中出现的警告#3036-D,即系统和非系统包含目录冲突的问题。首先,我得理解这个警告的具体含义。根据ARMCC的文档,这个警告通常发生在同一个目录被同时指定为系统包含目录和非系统包含目录时。系统包含目录通常使用`--sys_include`选项或类似的方法指定,而非系统目录可能通过`-I`选项添加。当编译器在两种不同的路径设置中都发现了同一个目录,就会引发冲突。 接下来,我需要分析可能的原因。用户可能在项目配置中不小心将同一个目录添加到了系统和非系统包含路径中。例如,可能在IDE的设置里既通过`-I`添加了某个路径,又通过`--sys_include`或其他方式再次包含。或者,可能有一些默认的包含路径被同时视为系统和用户路径,导致冲突。 然后,思考解决方案。首先,用户需要检查项目的包含路径设置,确保没有重复。对于Keil MDK,用户可以在Options for Target -> C/C++ -> Include Paths中查看非系统包含目录,而在其他设置中可能配置了系统目录。需要逐一核对,移除重复的路径。 另外,如果某些目录确实需要作为系统包含目录,应使用`--sys_include`选项,并避免使用`-I`重复添加。例如,在编译器命令行中,如果已经用`--sys_include ./mydir`指定了系统目录,就不应该再用`-I ./mydir`添加同一路径。 还有一种情况是,用户可能使用了环境变量或IDE的默认设置,导致隐式添加了某些路径。这时候需要检查环境变量如`INCLUDE`,以及IDE的全局设置,确保没有冲突。 最后,需要验证解决方案是否有效。用户修改路径设置后,重新编译项目,观察警告是否消失。如果仍有问题,可能需要进一步检查是否有其他配置项或脚本自动添加了路径。 此外,用户可能还会关心如何区分系统和非系统目录的使用场景。系统目录通常用于编译器自带的头文件,而用户目录用于项目特定的头文件。正确区分有助于避免冲突,并提高编译效率。 总结步骤:检查项目配置,移除重复路径,正确使用编译选项,验证修改结果。同时,理解系统和非系统目录的区别,合理配置项目设置,避免未来出现类似问题。</think>关于Keil ARMCC编译器警告#3036-D(系统与非系统包含目录冲突)的解决方法,以下是分步解决方案: 1. **理解警告根源** 当同一目录被同时指定为系统包含目录(使用`--sys_include`)和非系统包含目录(使用`-I`选项)时,编译器会认为这是潜在的错误配置。例如: ``` Project/Include 同时出现在: -IProject/Include (非系统) --sys_include="Project/Include" (系统) ``` 2. **检查路径配置** - 在Keil MDK中打开`Options for Target -> C/C++` - 检查`Include Paths`列表(对应`-I`参数) - 检查`Misc Controls`字段是否包含`--sys_include`指令 3. **冲突解决方案** ```diff // 错误配置示例: Include Paths = "Drivers/STM32F4xx_HAL_Driver/Inc" Misc Controls = --sys_include="Drivers/STM32F4xx_HAL_Driver/Inc" // 正确配置应改为: Include Paths = 留空 Misc Controls = --sys_include="Drivers/STM32F4xx_HAL_Driver/Inc" 或 Include Paths = "Drivers/STM32F4xx_HAL_Driver/Inc" Misc Controls = 留空 ``` 4. **路径优先级处理** - 系统目录优先级高于非系统目录 - 使用`--strict_warnings`参数可提升警告为错误[^1] 5. **特殊情况处理** 如果使用第三方库需要保留双重包含: ```c #pragma diag_suppress 3036 // 仅针对特定文件禁用该警告 #include "conflicting_header.h" #pragma diag_default 3036 ```
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值