我刚刚看到了一些类似下面的代码,其中包含带有局部static
变量的未命名块或带有局部静态的表达式语句:
volatile uint8_t p = 1;
volatile uint8_t x = 0;
int main() {
{
static uint8_t l;
}
{
static uint8_t l;
}
uint8_t y1 = ({static uint8_t l; if (p) {l = 0;} l;});
uint8_t y2 = ({static uint8_t l; if (p) {l = 0;} l;});
return y1 + y2;
}
我想知道在这种未命名的块中声明变量static
的目的是什么?
我假设(不确定)每个这样的块的局部静力学都是不同的,但是离开该块后我无法到达它。查看对象文件会显示它们在公共块中获得不同的名称。
(请不要对上面的代码进行推理...只是为了演示static
的使用
前 2 个块是无用的。接下来的 2 行正在初始化。.这是一个GCC扩展的东西,称为复合语句。
我们需要在复合语句中使用静态吗?
不。您也可以在没有static
的情况下使用它。
请记住一件事,您在其中创建的任何临时对象{}
在此语句结束时都会被销毁。所以以后也不能使用它们。 没有用,在复合语句中使用static
也。简单的int
也可以。
显然,您展示的玩具代码 - 这些静态甚至化合物列表除了向您展示它们可以使用之外没有任何目的。毫无用处。所有这一切都是为了return 0
.
额外积分
在这里,y1
和y2
使用最后一个语句值初始化,即l
。y1
和y2
之和的结果将是0
。
来自gcc
的在线文档
复合语句中的最后一件事应该是表达式 后跟一个分号;此子表达式的值用作 整个构造的值。
如果您通读本文档,您将看到一行解释其实际用途的行
此功能在使宏定义"安全"时特别有用 (以便它们只计算一次每个操作数)。例如,
maximum
函数在标准 C 中通常定义为宏 遵循:
#define maxint(a,b)
({int _a = (a), _b = (b); _a > _b ? _a : _b; })
与这里的宏不同,这里的计算a
和b
一次,而不是像另一个宏那样两次。
#define max(a,b) ((a) > (b) ? (a) : (b))