msfet 发表于 2015-9-7 17:30:21

关于arm代码里一段不懂的,求解释;

#ifndef __KBI_H_
#define __KBI_H_       

#ifdef__KBI_C_
#define KBI_EXT
#else
#define KBI_EXT extern
#endif



红色字体这个是什么意思啊?希望大家能帮我解释一下谢谢

msfet 发表于 2015-9-7 17:33:20

KBI_EXT INT8U KeyNow;

鲜衣怒马 发表于 2015-9-7 17:58:56

KBI.h肯定会被多次应用,第一次KBI_EXT INT8U KeyNow经过预编译变成INT8U KeyNow,第二个文件经过预编译就变成extern INT8U KeyNow了

armstrong 发表于 2015-9-7 18:03:07

给你下面三个示例文件:kbi.h, kbi.c, other.c

kbi.h
#ifndef __KBI_H_
#define __KBI_H_

#ifdef__KBI_C_
#define KBI_EXT
#else
#define KBI_EXT extern
#endif


KBI_EXT int a;
KBI_EXT int b;
KBI_EXT int c;

#endif /* __KBI_H_ */
kbi.c
#define __KBI_C_
#include "kbi.h"

int get_a(void){
return a;
}


other.c
#include "kbi.h"

int use_c(void){
return c;
}

解释:
由于kbi.h是公共头文件,可以在多个C文件中用include包含。有了KBI_EXT这样的定义,就可以保证只在一个C文件(这里举例的是kbi.c)定义变量,而在其它C文件中只是引用。这样即方便变量的管理又可以避免重定义错误。

liurangzhou 发表于 2015-9-7 20:13:33

armstrong 发表于 2015-9-7 18:03
给你下面三个示例文件:kbi.h, kbi.c, other.c

kbi.h


然而并没有什么卵用,全用extern没问题的

armstrong 发表于 2015-9-7 22:55:00

liurangzhou 发表于 2015-9-7 20:13
然而并没有什么卵用,全用extern没问题的

这只是一种代码的写法(风格),不是必须的。我也没这个习惯,只是解答楼主的问题而已。
请参见uC/OS-II的源代码,它就是用这种风格的。

msfet 发表于 2015-9-8 06:16:07

非常感谢大家的回答 {:hug:}

374184600 发表于 2015-9-8 13:36:03

armstrong 发表于 2015-9-7 18:03
给你下面三个示例文件:kbi.h, kbi.c, other.c

kbi.h


原来如此。。。
一看代码,就清楚了。

ijlc1314 发表于 2015-9-8 14:06:21

这种写法挺好的

jiulong855@.163 发表于 2015-9-10 15:40:55

选择编译,宏定义

blxy 发表于 2015-9-15 23:26:38

liurangzhou 发表于 2015-9-7 20:13
然而并没有什么卵用,全用extern没问题的

这样kbi.c文件里就不用写a,b,c三个变量的定义了,增加或修改全局变量也只需修改kbi.h就可以了

liurangzhou 发表于 2015-9-15 23:51:22

blxy 发表于 2015-9-15 23:26
这样kbi.c文件里就不用写a,b,c三个变量的定义了,增加或修改全局变量也只需修改kbi.h就可以了 ...

你关注的不在重点,它这里重点是有extern和没有extern
页: [1]
查看完整版本: 关于arm代码里一段不懂的,求解释;