【问题标题】:Purpose of static storage duration variables in unnamed block/sope?未命名块/sope中静态存储持续时间变量的目的?
【发布时间】:2018-06-11 00:05:07
【问题描述】:

我刚刚看到一些类似以下的代码,其中包含带有本地 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的使用)

【问题讨论】:

  • 限制标识符的范围通常是好的。这也适用于静力学。
  • 第一块是废话。您应该询问实际用途,我们可以解释。
  • 你写“我刚刚看到一些类似下面的代码,......”很可能你已经删除了一些上下文信息,其中包含关于为什么这样做的线索。如果不出意外,它可能是某些预处理或自动代码生成的结果,在其他情况下会产生更有用的代码。要获得正确的答案,您需要显示原始代码并可能提供有关它的其他信息。

标签: c scope static


【解决方案1】:

前 2 个区块没用。接下来的 2 行正在初始化。 .这是一个 GCC 扩展的东西,称为复合语句。

我们需要在复合语句中使用静态吗?

没有。不用static 也可以使用它。

请记住,您在 {} 中创建的任何临时对象都会在此语句结束时被销毁。所以它们以后也不能使用。 没有用,在复合语句中也使用static。简单的int 也可以。

很明显,您展示的玩具代码 - 那些静态数据甚至复合列表除了向您展示它们可以使用之外没有任何用途。根本没有任何目的。所有这些都只是return 0

加分

这里y1y2 被初始化为最后一个语句值ly1y2 之和的结果将是 0

来自online documentation of gcc

复合语句中的最后一件事应该是一个表达式 后跟一个分号; 这个子表达式的值作为 整个构造的值

如果你仔细阅读这个文档,你会看到一行解释它的实际用途

此功能在使宏定义“安全”方面特别有用 (以便他们对每个操作数只评估一次)。例如, maximum 函数在标准 C 中通常定义为宏 如下:

#define maxint(a,b) \
  ({int _a = (a), _b = (b); _a > _b ? _a : _b; })

与此处的宏不同,ab 计算一次而不是其他宏的两倍。

#define max(a,b) ((a) > (b) ? (a) : (b))

【讨论】:

    猜你喜欢
    • 2021-08-20
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 2020-02-17
    • 1970-01-01
    • 2015-08-09
    • 2018-08-02
    • 1970-01-01
    相关资源
    最近更新 更多