【问题标题】:GCC's scope depth representation methodGCC的范围深度表示方法
【发布时间】:2022-01-04 08:01:46
【问题描述】:

GCC中描述file_scope的深度为1,external_scope为0。 我写了一个程序来测试结果。

int main() {
        int a;
        {
                int b;
        }
        {
                int c;
        }
        if (1) {
                int d;
        }
}

变量a的深度是2,bc都是3,但是变量d的深度是5。

为什么变量d的深度不是3或4?

【问题讨论】:

  • 什么是可变深度,你是怎么知道的?
  • 在 gcc/c/c-decl.c 文件中
  • 也许是因为 gcc 的作者发现它对他们的目的很方便。为什么不? if 语句本身 +1,if 内的 then 分支 +1,大括号 +1。这个数字不必反映您为了达到最高级别而展开的范围数。这只是一个实现细节。

标签: c scope declaration


【解决方案1】:

根据 C 标准(6.8.4 选择语句)

3 选择语句是一个块,其范围是其封闭块范围的严格子集。每个关联的子语句也是一个块,其范围是选择语句范围的严格子集。

这是一个演示程序。

#include <stdio.h>

int main( void )
{
    if ( sizeof( struct A { long x; } ) == sizeof( long long ) )
    {
        struct A
        {
            long x;
        } a;

        printf( "sizeof( a ) within if = %zu\n", sizeof( a ) );
    }
    else
    {
        struct A
        {
            long long x;
        } a;
        
        printf( "sizeof( a ) within else = %zu\n", sizeof( a ) );
    }
}

在 if 语句中引入了类型说明符struct A

    if ( sizeof( struct A { long x; } ) == sizeof( long long ) )

在 if 语句的子语句中,还引入了同名的类型说明符,隐藏了 if 语句中引入的类型说明符。

因此,如果要像您一样计算范围,那么有以下范围;

  1. 文件范围
  2. 以参数列表开头的块作用域 main的定义
  3. if 语句的范围
  4. 以及 if 语句子语句的范围

gcc 可以为 if 语句的复合语句添加自己的作用域。

【讨论】:

  • 由于a(在问题中)处于深度 2,添加两个嵌套范围应该将其移动到 4,但它在 5。那里还有一个范围。
  • @HolyBlackCat if 语句子语句是一个有自己范围的块,复合语句也是一个有自己范围的块。它可能是相同的范围,但“深度”变量不必准确反映这一点。它只需要为不同的嵌套范围取不同的值。
猜你喜欢
  • 1970-01-01
  • 2018-03-15
  • 2013-05-10
  • 1970-01-01
  • 2018-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-02
相关资源
最近更新 更多