依赖于C编译器和编译器标志的版本,可以在函数中的任何位置初始化变量(据我所知).
我习惯将所有变量放在函数的顶部,但讨论开始时关于变量的内存使用,如果在函数的任何其他位置定义的话.
下面我写了两个简短的例子,我想知道是否有人能解释我(或验证)如何分配内存.
示例1:变量y是在可能的返回语句之后定义的,有可能这个变量不会被用于这个原因,据我所知这没关系,代码(内存分配)将是如果变量放在函数的顶部,则相同.它是否正确?
示例2:变量x在循环中初始化,这意味着此变量的范围仅在此循环内,但此变量的内存使用情况如何?如果放在功能的顶部会有什么不同吗?或者只是在函数调用的堆栈上初始化?
编辑:总结一个主要问题:减少变量的范围或更改第一次使用的位置(所以在其他任何地方而不是顶部)对内存使用有影响吗?
代码示例1
static void Function(void){
uint8_t x = 0;
//code changing x
if(x == 2)
{
return;
}
uint8_t y = 0;
//more code changing y
}
Run Code Online (Sandbox Code Playgroud)
代码示例2
static void LoopFunction(void){
uint8_t i = 0;
for(i =0; i < 100; i ++)
{
uint8_t x = i;
// do some calculations
uartTxLine("%d", x);
}
//more code
}
Run Code Online (Sandbox Code Playgroud) 在编写这个项目时,我遇到了一个需要能够同时处理uint8_t,uint16_t和uint32_t变量的函数的情况.
我试图找到一个合适的解决方案,以保持这种动态,而不会造成太多的混乱或大量的重复代码,但最重要的是,有一个保存解决方案.
在当前代码中,我使用带有union作为函数参数的结构:
typedef struct
{
DataType type;
union
{
uint8_t uint8;
uint16_t uint16;
uint32_t uint32;
} unsignedInt;
} anySizeUnsignedType;
Run Code Online (Sandbox Code Playgroud)
这是尝试使函数更加动态,但是,我的函数中有2个这样的类型,需要根据第三个变量进行比较.
所以,这基本上就是我要做的事情:
anySizeUnsignedType Var1 = arg1;
anySizeUnsignedType Var2 = arg2;
uint8_t comparison = arg3;
switch (comparison)
{
case ABOVE:
if (Var1 > Var2 )
{
retValue = TRUE;
}
break;
case EQUAL:
if (Var1 > (Var2 - AnotherVar)
&& (Var1 < (Var2 + AnotherVar)))
{
retValue = TRUE;
}
break;
case BELOW:
if (Var1 < Var2 )
{
retValue = …Run Code Online (Sandbox Code Playgroud) 我正在努力进行简单的检查,如果用户输入只是空(Enter),并且如果将变量设置为新值...花费一个小时但它不起作用.目标是让输入的值以反斜杠开头,如果没有输入,则只是一个空字符串.
码:
SET myTargetServerInstanceName=anyNOPEdummyValue
SET /P myTargetServerInstanceName=Enter Target Server INSTANCE Name:
IF %myTargetServerInstanceName%==anyNOPEdummyValue SET myTargetServerInstanceName=
IF NOT %myTargetServerInstanceName% == [] SET myTargetServerInstanceName=\%myTargetServerInstanceName%
Run Code Online (Sandbox Code Playgroud)
这会导致错误:
SET此时出人意料.
c ×2
embedded ×2
arm ×1
batch-file ×1
if-statement ×1
memory ×1
stack ×1
string ×1
variables ×1