搜索
bottom↓
回复: 15

keil c中没有使用到的函数会编译时候会有警告。

[复制链接]

出0入0汤圆

发表于 2010-8-11 17:37:53 | 显示全部楼层 |阅读模式
我想写一个模块,模块里面有我常用的一些功能函数,比如:
a.h文件

#ifndef _a_h_
#define _a_h_

extern void one(void);
extern void two(void);

#endif

a.c文件

#include "a.h"

extern void one()
{
   ........
}

extern void two()
{
   .........
}

main.c

#include <reg52.h>
#include "a.h"

void main()
{
   while(1)
   {
     one();
   }

}

我只使用了a.h文件中定义的一个函数one,two没有用到
keil 编译的时候给出警告

有什么方法能让没有使用过的函数,不进行连接编译?

那keil c的库又是怎么样弄的?

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2010-8-11 19:30:20 | 显示全部楼层
把函数做成宏定义如何

#define one()  do{...}while(0);

出0入0汤圆

发表于 2010-8-11 22:15:59 | 显示全部楼层
每个.C文件中只写一个函数

出0入0汤圆

发表于 2010-8-11 23:51:41 | 显示全部楼层
设置屏蔽等级,忘了是6,13,还是16,试试就知道了,条件编译也行

出0入0汤圆

发表于 2010-8-12 02:12:51 | 显示全部楼层
人家怎么知道你没有调用呢?调用不一定是显式的,也许是修改堆栈,也许是用函数指针,方法多得很,编译器无法知道你是否会调用到该函数,在它的"眼"里,存在即为合理.

所以,没有用到的函数你可以用#if #endif封闭起来.

出0入0汤圆

发表于 2011-5-29 08:16:16 | 显示全部楼层
这个问题还是没有解决,有谁知道吗?

出0入0汤圆

发表于 2011-5-29 08:48:03 | 显示全部楼层
我增加一些问题,网上找了半天没有解决

1.  编译器没有被调用才出现警告,编译器肯定知道这个函数没有被调用.

2.  #if #endif怎么用,难道我需要调用这个函数,另外还需要define一个表示我调用了?这也太麻烦了,
   keil中调用库函数是怎么实现,没见到要怎么作啊

3.  库函数编译的存储方式如果与主程序不同也警告,同样keil本机库函数调用也没有这个警告,不知道如何消除

4.  屏蔽等级如何设置,好像只是设置优化等级的

5.  #pragma WARNINGLEVE(0) 指令怎么不能用,警告"此行被忽略",并且取消报警也不是我目的,我发现删除这个函
    数和没有删除目标代码大小是不一样的

6.  #pragma rom(small)也不能用 "XXXX.C(129): error C252: misplaced primary control, line ignored"

出0入0汤圆

发表于 2011-5-29 09:12:54 | 显示全部楼层
why do you want to disable it?

出0入0汤圆

发表于 2011-5-29 09:32:22 | 显示全部楼层
在keil4中,用LX51代替BL51连接器,然后再Misc control里添加REMOVEUNUSED这条指令,据说可以,不过我也没验证过。

出0入0汤圆

发表于 2011-5-31 00:18:53 | 显示全部楼层
这是不可能消除的.

程序无法知道你不会调用它,因为你有可能使用非直接调用的指令,而是用散列指针之类的方法,程序是预测不到的,所以它不会给你做优化.

如果你真想消除警告,就用#if #endif把它"软删除"掉.

出0入0汤圆

发表于 2011-10-8 21:04:10 | 显示全部楼层
我用8楼的方法是可以去除不用的代码。但是今天遇到了问题,函数指针指向的函数不存在了。这就是间接引用的问题吧。哎

出0入0汤圆

发表于 2011-10-8 21:05:51 | 显示全部楼层
有没有什么 #pragma 可以告诉链接器不要把指定的函数去掉呢?我现在去掉了 REMOVEUNUSED ,但是编译后说DATA区溢出了。

出0入0汤圆

发表于 2012-2-8 00:43:15 | 显示全部楼层
这个问题我今天也碰到过了.上网也查不出个所以然来.用谷哥查到了这里来.我也想知道怎么做.

出0入4汤圆

发表于 2012-2-8 08:25:45 | 显示全部楼层
在Target Options->BL51 Misc->Warnings:Disable Warning Numbers中直接填上16就可以了。

出45入88汤圆

发表于 2014-11-18 19:57:43 | 显示全部楼层
keil c51确实有这个不好的地方 。 IAR FOR AVR 就很好解决这个问题。为什么C51不学一下?

出0入0汤圆

发表于 2014-11-19 07:38:20 来自手机 | 显示全部楼层
编译器确实知道你有没有调用,14楼的方法可以将警告忽略
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 22:17

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表