在编写大型程序时,为了实现相应的功能和需求,通常会编写出多个源文件和头文件,不同的源文件和头文件负责不同的功能实现,比如a1.c a2.c a3.c文件实现功能a,b1.c b2.c b3.c文件实现功能b。现在,实现一个新的功能c,可能需要读写功能a中的某些全局变量,如何读写这些全局变量算是合理地呢?这里说的合理,指的是模块a和模块c之间具有低耦合,相互独立。
下面示范几个例子,着重讨论裸机状态下读写全局变量的合理方法。
(1)读取变量
方法一
a1.c文件中的代码
static int varStudentScore;
int readvarStudentScore(void)
{
return varStudentScore;
}
c1.c文件中读取a1.c中全局变量的代码
void fun(void)
{
int varStudentScore;
varStudentScore=readvarStudentScore();
}
方法二
a1.c文件中的代码
static int varStudentScore;
static char varStudentName[100];
void readvarStudentData(int* score, char * name, int namesize)
{
*score=varStudentScore;
strncpy(name,varStudentName,namesize);
name[namesize-1]='\0';
}
c1.c文件中读取a1.c中全局变量的代码
void fun(void)
{
int varStudentScore;
char varStudentName[90];
readvarStudentData(&varStudentScore, varStudentName,90);
}
方法一和方法二都能读取另外一个模块/文件的全局变量,不同的是,方法一支持读取一个变量,方法二支持同时读取多个变量。由于每次需要调用函数会有进栈入栈,两种方法也带来了额外地系统开销。如果方法一和方法二仅仅运用在编写应用程序,额外的系统开销可以忽略不计,毕竟不是在编写操作系统内核。
(2)修改变量
a1.c文件中的代码
static int varStudentScore;
void modifyvarStudentScore(int score)
{
varStudentScore=score;
}
c1.c文件中的代码
void fun(void)
{
int modifyscore=99;
modifyvarStudentScore(modifyscore);
}
以上讨论的情况都是裸机状态下的,实时操作系统RTOS下全局变量的读写(多线程之间的通信方法)将有很大不同,将另起一篇文章进行描述。
1298

被折叠的 条评论
为什么被折叠?



