我在尝试定义本地静态变量时遇到此错误。
Initializer元素不是常量。
我想在此递归中保留var的第一个值。怎么通过这个? 希望您也澄清将参数分配给要防止的本地静态变量的副作用。
int function(int var)
{
static int index=var;
//some code ...
return var==0?1:function(var-1);
}
答案 0 :(得分:2)
在函数开始之前初始化static
变量。它就像一个全局变量,只有函数范围。编译器不能使用它还不知道的值。
您可以使用帮助器布尔值解决此问题:
int function(int var)
{
static int index_is_set=0;
static int index;
if (!index_is_set)
{
index = var;
index_is_set = 1;
}
//some code ...
return var==0?1:function(var-1);
}
所以第一次输入它设置值的函数时,将布尔标志设置为1
,这样就不会被其他调用覆盖。
请注意,这对于构造来说不是很有用,因为如果要在程序中第二次递归调用函数(在我第一次获得结果之后),就没有办法重置变量(除非你使index_is_set
全局,所以你可以从外面重置它。)
请注意,通过将起始值用作额外参数,可以完全删除所有这些static
内容。
int function(int var, int start_value)
{
// ...
return var==0 ? 1 : function(var-1,start_value);
}
第一个电话就像:
function(20,20);
或包含在隐藏此实现的函数中:
int function_wrapper(int var)
{
return function(var,var);
}
在所有调用中传递起始值。消耗更多的自动变量空间,但更清洁,没有记忆效应&更容易调试。
答案 1 :(得分:2)
案例:
static
是一个带初始化程序的声明(参见 ISO / IEC 9899:2011§6.7声明)。该语句声明一个int function(int first_var, int var)
{
//some code ...
return var==0?1:function(first_var, var-1);
}
...
function(5, 5); //First call
变量初始化为一个值,该值必须是在编译时定义的常量。简单来说,因为在执行开始之前初始化了值,必须在函数使用之前定义初始值设定项。
如果你想以你使用的方式保留递归的第一个值不是一个好的选择,原因有很多:
一个解决方案可以是向函数2变量传递第一个值,并且该函数的第一次调用传递相同的值:
int function(int var)
{
static int index; //Declaration
index=var; //Assignement
//some code ...
return var==0?1:function(var-1);
}
为了完整起见,可以通过在静态变量的定义中破坏您的语句而不进行初始化(或使用通用初始化),然后执行赋值( ISO / IEC 9899:2011§6.5.16分配运营商):
UIView
但是因为它会在每次重新分配时重新分配,所以这只是一个很大的废话...