MDK warning: #231-D: declaration is not visible outside of function
发布日期:2021-06-30 22:01:53 浏览次数:2 分类:技术文章

本文共 963 字,大约阅读时间需要 3 分钟。

前言

在MDK中写着写着,编译就出了一个警告:

..\x.h(24): warning:  #231-D: declaration is not visible outside of function

大概意思是,这个数据类型已经在其他地方定义了,但是在当前实现中不可见。

问题代码为

bool (*cbproc_device_id_ctrl)(TAG_DEV_CMD_DG_NODE* pinfo, int* pi_port, int* pindex, char* buf_to_send, int* pi_send_cnt);

出问题的参数类型为 TAG_DEV_CMD_DG_NODE

我能确认头文件已经include了。

最后调整了半个小时,才知道,是头文件重复包含引起的(本头文件为a.h, TAG_DEV_CMD_DG_NODE所在的头文件为b.h, 还有其他依赖的头文件为x.h. a.h include b.h, b.h include a.h, x.h和a.h, b.h之间也有相互的include)。反正当前工程的头文件include比较随意.

虽然每个头文件都有交叉编译宏来防止重复包含头文件引起的编译错误。

但是这个警告应该和编译器有关系,不是代码写错了。

最后,只在头文件中包含必须的依赖头文件。这个警告没了,全部编译过。

总结:

  • 头文件中的交叉编译宏一定要加。
  • 即使有交叉编译宏,也不要随便的在每个头文件中include其他不必要的头文件。
    .h头文件中只include必要的头文件
    .c中可以随便include头文件
    如果真的是公用的头文件,请保持公用头文件中的最小化include其他依赖的头文件。
    不能为了代码写的方便,就随便向公用头文件中include其他无关的头文件.
  • 不要为了节省一个.h, 就往需要用函数A的头文件中写入 extern void fn_a(). 而是应该在fn_a()实现的配套fn.h中声明fn_a(), 然后包含fn.h
  • 在#pragma pack(push, 1)和#pragma pack(pop)之间,只写结构的定义。不要将枚举值定义,外部函数声明等和结构体内存对齐有关的内容写进去。
  • 编译器没有那么聪明。如果编码风格规范,可以防止出现奇怪的编译错误或警告。

转载地址:https://lostspeed.blog.csdn.net/article/details/103552167 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:12V将路由器网口烧了
下一篇:cJSON指定内存分配函数

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年04月11日 22时48分42秒