Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 嵌入式系统封装的目的_C_Variables_Encapsulation - Fatal编程技术网

C 嵌入式系统封装的目的

C 嵌入式系统封装的目的,c,variables,encapsulation,C,Variables,Encapsulation,我对C编程有点陌生,我想问一个问题。 我正在使用MPLAB c18编译器 起初,当我开始编码并最终得到很多变量时,有些是全局变量,有些是外部变量 我在一篇关于变量封装的文章中发现了一条语句 Replacing float x; float y; float z; with these float X(); float Y(); float Z(); 这是不是一种意图 各函数内部的局部变量,并分配 局部浮点x=浮点x();局部浮动y=浮动y() 我将非常感谢您在本案中提供的意见和

我对C编程有点陌生,我想问一个问题。 我正在使用MPLAB c18编译器

起初,当我开始编码并最终得到很多变量时,有些是全局变量,有些是外部变量

我在一篇关于变量封装的文章中发现了一条语句

Replacing
 float x;
 float y;
 float z;

 with these
 float X();
 float Y();
 float Z();
这是不是一种意图

各函数内部的局部变量,并分配

局部浮点x=浮点x();局部浮动y=浮动y()

我将非常感谢您在本案中提供的意见和澄清。我的解释是否有误。 所以我的问题是,封装是否是为了减少函数中的全局变量和使用更多的局部变量

将替换为“float x”(可能在某些标题中是外部float x)有效地封装了变量。
您可能需要以下内容:

float x(); /* get x */
void setX(float newVal); /* set x here */
但这是相当普遍的,真正的实现需要根据您的需要进行定制(您需要setter吗?您需要getter吗?您需要优化吗?)。
一般来说,特别是如果您对C比较陌生,封装有助于更简洁的设计,并防止简单的错误。
例如,假设更改值X涉及执行其他任务(例如,X是核导弹发射序列的倒计时)。
封装时,您的代码看起来像:

void setX(float newVal){
    x = newVal;
    startNuclearLaunchSequence();
}
如果你没有这个设定器,你需要找到你设定X的所有位置(可能也是你的同事设定的),然后手动发射火箭,否则你会失火,然后-再见天启。

我们不想这样,是吗?

这是一个非常广泛的问题,这在很大程度上取决于你的设计和程序的目的。我只关心的是,封装是否用于减少全局变量和减少崩溃/回溯的代码。全局变量可以通过将其值作为参数传递并在函数之间返回值来避免。将它们放在跟踪全局状态的无参数函数中不会对程序结构造成太大的改变,它只会引入额外的函数调用。@larsmans感谢您的回答。您能提供一个例子吗?这样“全局变量可以通过将其值作为参数传递并在函数之间返回值来避免”.@Rookie91:simple:每当函数需要
x
时,将其作为参数传递。当多个变量(几乎)总是需要一起传递时,将它们组合成一个
struct
并传递。所以
void printx(){printf(“%f\n”((double)x);}
变成
void printx(float x){/*same*/}
。我需要setter和getter,顺便说一句:)。所以通过这个方法,我们可以将变量限制为局部变量,并减少全局右键?是的,您可以将get()数据分配给局部变量,根据需要对其进行操作,然后使用set()将其重新分配。