你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于.c文件中的宏定义

[复制链接]
黑皮男 提问时间:2015-6-27 09:36 /
现在有一事不明,公司框架代码里有个宏定义是定义在.c文件中的,但是在其他文件中用到了,只不过用的这个宏定义的文件被封装在库里面,只是无法查看,其他可见的文件中没有用到这个宏,所以敢肯定只有被封装的库里用到了。请问这个怎么做到的,我自己定义的话就不行
收藏 评论21 发布时间:2015-6-27 09:36

举报

21个回答
moyanming2013 回答时间:2015-6-30 21:58:28
黑皮男 发表于 2015-6-30 19:03
/***keymap.c***/
#define REMOTE_ID   0xAB   //假设红外遥控的地址码为0xAB

没看出有什么“巧妙”,反而觉得程序结构太混乱了。不利于扩充和维护(现在LZ深受其害)。
别的文件中无法引用这个keys变量,因为没有include。会出现编译错误。
想必可以如下:
/*abc.h*/
typedef enum{
    key1=0x01;
    key2=0x72;
    maxKey=2
};
extern unsinged char const keys[maxKey];

/*abc.c*/
#include "abc.h"
unsigned char const keys[maxKey] = {key1,key2};

扩充按键时,只需要在enum中添加key并使maxKey增加,并更新keys的定义即可,不用管keys的长度,因为这个长度在编译时已确定:maxKey,keys和maxKey在abc.h引用的任何地方都可以直接使用。sizeof等库函数不太建议经常使用,逼不得已再用,一是sizeof等(由其strlen)开销大(时间和空间都大);二是用了maxKey可以直接知道数组的大小。
黑皮男 回答时间:2015-6-30 19:03:39
moyanming2013 发表于 2015-6-30 14:06
哦,那能否请lz写一个示例啊?
不用贴源码,只是自己写个示例,这样既能分享这个“巧妙”,又或许能解决L ...

/***keymap.c***/
#define REMOTE_ID   0xAB   //假设红外遥控的地址码为0xAB

unsigned char const keys[]=
{
   key1,
   key2,
   key3,
   key4,
   key5
};
/***********************/
这是暴露出来的演示代码,我们只需要在这个c文件中定义好键值和红外的地址码就可以了,如果是在头文件中同时定义这个数组的话在其他地方多次包含此头文件时会出现重复定义的现象。而且还有一个问题就是我所遇到的关于常量数组的定义都是定义在c文件中,而且在其他文件中引用时是没有声明,不过这都是在STM8用STVD的开发中遇到的现象,参看此贴https://www.stmcu.org.cn/module/forum/thread-602365-1-1.html
黑皮男 回答时间:2015-6-30 19:05:58
jinyi7016 发表于 2015-6-27 22:49
可以把文件发上来,看看

/***keymap.c***/
//演示代码
#define REMOTE_ID   0xAB   //假设红外遥控的地址码为0xAB

unsigned char const keys[]=
{
   key1,
   key2,
   key3,
   key4,
   key5
};
/***********************/
moyanming2013 回答时间:2015-6-27 14:42:28
得用头文件才行吧,然后#include进去。或者lz用一个假设的例子讨论下。
jinyi7016 回答时间:2015-6-27 22:49:04
可以把文件发上来,看看
stary666 回答时间:2015-6-28 08:55:01
发上来看看
cxtarm 回答时间:2015-6-28 10:02:50
你怎么知道其他地方使用了,不是没法查看吗
黑皮男 回答时间:2015-6-29 08:03:23
cxtarm 发表于 2015-6-28 10:02
你怎么知道其他地方使用了,不是没法查看吗

能看到的地方都没有用到,而且这个宏在程序中肯定得用,所以只能在封装起来的地方用了,而且相关的那部分代码就是被封装起来了
黑皮男 回答时间:2015-6-29 08:55:26
moyanming2013 发表于 2015-6-27 14:42
得用头文件才行吧,然后#include进去。或者lz用一个假设的例子讨论下。

比如说在一个.c文件中定义了红外按键的码值,并且用宏定义定义了红外的地址码,那么解码的部分被封装起来了,这个地址码的宏定义肯定是被封装起来的解码那一部分的代码引用了
moyanming2013 回答时间:2015-6-29 12:19:49
黑皮男 发表于 2015-6-29 08:55
比如说在一个.c文件中定义了红外按键的码值,并且用宏定义定义了红外的地址码,那么解码的部分被封装起来 ...

怎么弄的那么复杂!
这些本来在头文件中的,感觉属于猪一样的队友造成的。
黑皮男 回答时间:2015-6-30 09:07:53
moyanming2013 发表于 2015-6-29 12:19
怎么弄的那么复杂!
这些本来在头文件中的,感觉属于猪一样的队友造成的。 ...

你是没有见到这个代码,你要是见到了就会感觉很巧妙
moyanming2013 回答时间:2015-6-30 14:06:21
黑皮男 发表于 2015-6-30 09:07
你是没有见到这个代码,你要是见到了就会感觉很巧妙

哦,那能否请lz写一个示例啊?
不用贴源码,只是自己写个示例,这样既能分享这个“巧妙”,又或许能解决LZ的问题呢!
黑皮男 回答时间:2015-6-30 19:05:40

/***keymap.c***/
//演示代码
#define REMOTE_ID   0xAB   //假设红外遥控的地址码为0xAB

unsigned char const keys[]=
{
   key1,
   key2,
   key3,
   key4,
   key5
};
/***********************/
759611 回答时间:2015-6-30 21:30:05
宏定义……不该放.h文件吗
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版