返回介绍

1.1 作用域

发布于 2024-10-12 21:58:08 字数 1690 浏览 0 评论 0 收藏 0

作用域(scope)指符号和表达式在其中 可见 或 可被访问 的上下文。对象(包括函数)标识符有效范围由其声明位置决定。

标识符(Identifier)是用来标识实体的符号,如变量、常量、函数、类型、属性名称等。

关键字(keyword)是为编译器保留,在词法中有特殊含义的标记,不能用作标识符。

四种作用域:

  • 文件 (source file)
  • (block)
  • 函数原型 (function prototype)
  • 函数 (function)

声明在任何块和函数之外,拥有文件作用域。(全局变量、函数)

声明出现在块或参数列表内,则该标识符仅在块内可见。(参数、局部变量等在特定块内有效)

声明出现在函数原型(非定义)中,仅在原型结束前可见。(如参数,仅用于提示,可省略)

函数作用域是大括号之间的区域,标签(label)是唯一有此作用域的标识符。(可 goto 到函数内任何位置)

作用域可以嵌套(nested)。内部(inner)可以访问外部(outer),反之不行。

内名标识符可以遮蔽外部同名标识符。

char *x = "abc";

int main (void)
{
    printf("%p, %s\n", x, x);       // global.x : 0x402004, abc

    int x = 100;
    printf("%p, %d\n", &x, x);      // local.x : 0x7ffea1aafd70, 100

    {
        float x = 1.0;
        printf("%p, %f\n", &x, x);  // inner.x : 0x7ffea1aafd74, 1.000000
    }

    printf("%p, %d\n", &x, x);      // local.x : 0x7ffea1aafd70, 100

    return 0;
}

同一作用域内,不能以相同名称重复定义。

函数参数等同函数块变量,不能重复定义。

int main (void)
{
    int x = 1;
        ^ previous definition of 'x' was here
        
    float x = 1.1;
          ^ error: conflicting types for 'x'

    return 0;
}
void test(int x)
{         ~~~~^ previous definition of 'x' was here

    char x;
         ^ error: 'x' redeclared as different kind of symbol
         
    x = 10;
}

提示:为避免混淆,小块作用域的标识符建议使用短名(如:i、x、n 等),函数内跨域的用有实际意义的单词,全局则使用多个单词组合,避免多个模块(源文件)间冲突。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文