C++ c++;在函数范围的if块内定义变量
背景:我正在为一个硬件开发几个不同的控制器(超过10个左右),这涉及到在RTAILinux下硬实时运行代码。我为硬件实现了一个类,每个控制器作为该类的一个单独成员函数。我希望根据选择的控制器,将各个控制变量的期望轨迹传递给每个控制函数。此外,由于每个控制器都有几个参数,我希望在不必浏览整个代码和更改参数的情况下快速切换控制器,因此我希望在一个位置定义所有控制变量,并根据我选择运行的控制器来定义它们。下面是我要寻找的最起码的工作示例 我希望在C++中根据条件是否为真来定义变量,如下所示:C++ c++;在函数范围的if块内定义变量,c++,variables,scope,C++,Variables,Scope,背景:我正在为一个硬件开发几个不同的控制器(超过10个左右),这涉及到在RTAILinux下硬实时运行代码。我为硬件实现了一个类,每个控制器作为该类的一个单独成员函数。我希望根据选择的控制器,将各个控制变量的期望轨迹传递给每个控制函数。此外,由于每个控制器都有几个参数,我希望在不必浏览整个代码和更改参数的情况下快速切换控制器,因此我希望在一个位置定义所有控制变量,并根据我选择运行的控制器来定义它们。下面是我要寻找的最起码的工作示例 我希望在C++中根据条件是否为真来定义变量,如下所示: intf
intfoo()
{
int i=0;
如果(i==0)
{
int a=0;
浮动b=1;
双c=10;
}
elseif(i==1)
{
int e=0;
浮点数f=1;
双g=10;
}
//内存已锁定,用于硬实时执行
//从这里以硬实时方式执行
虽然(某些条件)
{
//100行代码
如果(i==0)
{
a=a+1;
b=b*2;
c=c*4;
//100行代码
}
elseif(i==1)
{
e=e*e*e;
f=f*3;
g=g*10;
//100行代码
}
//100行代码
}
//以硬实时方式停止执行
}
上述代码在执行时给出错误,因为if块中定义的变量范围仅限于相应的if块。有谁能提出更好的方法来处理这个问题吗?C++中的最佳实践是什么? ,在这里,你可以简单地使用:
int foo()
{
int i = 0;
if (i == 0) {
int a = 0;
float b = 1;
double c = 10;
for(int j = 1; j < 10; j++) {
a = a + 1;
b = b * 2;
c = c * 4;
}
} else if (i == 1) {
int e = 0;
float f = 1;
double g = 10;
for(int j = 1; j < 10; j++) {
e = e * e * e;
f = f * 3;
g = g * 10;
}
}
}
intfoo()
{
int i=0;
如果(i==0){
int a=0;
浮动b=1;
双c=10;
对于(int j=1;j<10;j++){
a=a+1;
b=b*2;
c=c*4;
}
}else如果(i==1){
int e=0;
浮点数f=1;
双g=10;
对于(int j=1;j<10;j++){
e=e*e*e;
f=f*3;
g=g*10;
}
}
}
或者更好,创建子函数
void foo0()
{
int a = 0;
float b = 1;
double c = 10;
for(int j = 1; j < 10; j++) {
a = a + 1;
b = b * 2;
c = c * 4;
}
}
void foo1()
{
//.. stuff with e, f, g
}
int foo()
{
int i = 0;
if (i == 0) {
foo0();
} else if (i == 1) {
foo1();
}
}
void foo0()
{
int a=0;
浮动b=1;
双c=10;
对于(int j=1;j<10;j++){
a=a+1;
b=b*2;
c=c*4;
}
}
void foo1()
{
//…用e,f,g填充
}
int foo()
{
int i=0;
如果(i==0){
foo0();
}else如果(i==1){
foo1();
}
}
你需要阅读一本关于变量范围和生存期的C++ C++书。在使用之前声明变量。问题解决了。首先,您必须考虑为什么需要在if块中定义它们。您可以这样编写变量定义,但它们在下面的}
中超出了范围,因此您无法编写使用变量的代码(因为它们未定义)。在任何情况下,您都试图将两个不同的函数体组合成一个函数。使用两个单独的功能,一个用于处理a
、b
和c
,另一个用于处理e
、f
和g
。如果必须,请保留当前函数以调用正确的其他函数。请查看更新的帖子。在for循环中有100行公共代码,如果创建两个不同的函数,则需要重复这些代码。此外,循环在RTAI Linux下以硬实时方式执行,因此调用更多函数将消耗开销,并会通过增加抖动降低硬实时性能。请查看更新的帖子。在for循环中有100行公共代码,如果创建两个不同的函数,则需要重复这些代码。此外,循环是以硬实时方式执行的,因此调用更多函数会增加开销,并会增加抖动,从而降低硬实时性能。编译器可能会内联函数(比我们更好),通过将大小写分组为子函数,可以避免循环中的if else if
出现大量分支。