你的浏览器版本过低,可能导致网站不能正常访问!为了你能正常使用网站功能,请使用这些浏览器。
举报
黑皮男 发表于 2015-6-30 19:03 /***keymap.c***/ #define REMOTE_ID 0xAB //假设红外遥控的地址码为0xAB
moyanming2013 发表于 2015-6-30 14:06 哦,那能否请lz写一个示例啊? 不用贴源码,只是自己写个示例,这样既能分享这个“巧妙”,又或许能解决L ...
jinyi7016 发表于 2015-6-27 22:49 可以把文件发上来,看看
cxtarm 发表于 2015-6-28 10:02 你怎么知道其他地方使用了,不是没法查看吗
moyanming2013 发表于 2015-6-27 14:42 得用头文件才行吧,然后#include进去。或者lz用一个假设的例子讨论下。
黑皮男 发表于 2015-6-29 08:55 比如说在一个.c文件中定义了红外按键的码值,并且用宏定义定义了红外的地址码,那么解码的部分被封装起来 ...
moyanming2013 发表于 2015-6-29 12:19 怎么弄的那么复杂! 这些本来在头文件中的,感觉属于猪一样的队友造成的。 ...
黑皮男 发表于 2015-6-30 09:07 你是没有见到这个代码,你要是见到了就会感觉很巧妙
stary666 发表于 2015-6-28 08:55 发上来看看
没看出有什么“巧妙”,反而觉得程序结构太混乱了。不利于扩充和维护(现在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可以直接知道数组的大小。
/***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
/***keymap.c***/
//演示代码
#define REMOTE_ID 0xAB //假设红外遥控的地址码为0xAB
unsigned char const keys[]=
{
key1,
key2,
key3,
key4,
key5
};
/***********************/
能看到的地方都没有用到,而且这个宏在程序中肯定得用,所以只能在封装起来的地方用了,而且相关的那部分代码就是被封装起来了
比如说在一个.c文件中定义了红外按键的码值,并且用宏定义定义了红外的地址码,那么解码的部分被封装起来了,这个地址码的宏定义肯定是被封装起来的解码那一部分的代码引用了
怎么弄的那么复杂!
这些本来在头文件中的,感觉属于猪一样的队友造成的。
你是没有见到这个代码,你要是见到了就会感觉很巧妙
哦,那能否请lz写一个示例啊?
不用贴源码,只是自己写个示例,这样既能分享这个“巧妙”,又或许能解决LZ的问题呢!
/***keymap.c***/
//演示代码
#define REMOTE_ID 0xAB //假设红外遥控的地址码为0xAB
unsigned char const keys[]=
{
key1,
key2,
key3,
key4,
key5
};
/***********************/