7

我正在阅读一本关于 C 语言的书(“掌握 C” ),并在此处::的 Google Books 上的第 203 页上找到了关于范围解析运算符 ( ) 的主题。

但是当我运行以下代码示例(从书中复制)时,C 编译器给了我一个错误。我在 Internet 上进行了搜索,但在 C 中找不到对范围解析运算符的任何引用。

#include <stdio.h>
int a = 50;
int main(void)
{
    int a =10;  
    printf("%d",a);
    printf("%d\n", ::a);        
    return 0;
}

所以如果我想访问一个全局变量,那么我怎么能从main()函数中做到这一点呢?

4

6 回答 6

17

没有。C 没有范围解析运算符。C++ 有一个 ( ::)。也许您(或您的书)将 C 与 C++ 混淆了。

您问如何从具有自己的局部变量a的函数(此处)中访问全局变量。您不能在 C 中执行此操作。它在词法上超出范围。当然,您可以在其他地方获取变量的地址并将其作为指针传递,但这完全是另一回事。只需重命名变量,即“不要那样做”maina

于 2015-02-03T13:37:08.267 回答
8

不,命名空间是 C++ 的一个特性。

但是,可以a在您的示例中引用全局。您可以通过使用extern关键字来实现这一点:

#include <stdio.h>

int a = 50;

int main(void)
{
    int a = 10;
    printf("%d\n",a);

    { // Note the scope
        extern int a; // Uses the global now
        printf("%d\n", a);
    }

    return 0;
}

不过,这有点棘手。这是不好的风格。不要那样做。

于 2015-02-03T13:43:20.990 回答
5

::运算符在 C++ 而不是 C 中可用。如果要访问全局变量,请使用

#include <stdio.h>
int a = 50;
int main(void)
{
    int a =10;
    printf("%d",a); //prints 10
    {
        extern int a;
        printf("%d", a); //prints 50
    }
    return 0;
}

或者,您可以使用保存全局变量地址的指针a,然后如果您想打印全局变量的值,则取消引用该指针a

于 2015-02-03T13:44:10.687 回答
3

否(::运算符是 C++ 特定的)。在 C 语言中,如果您在不同的重叠范围(例如,文件范围a和块范围a)中使用相同的标识符,则块范围标识符会遮盖文件范围标识符,并且无法引用被遮盖的标识符。

避免阴影变量通常是最佳编程实践。许多 lint 类型的程序可以警告这种情况。

于 2015-02-03T13:39:50.213 回答
0

在普通 C 中,没有范围解析。您必须以不同的方式命名变量。

这意味着a以下所有变量都是不同的:

#include <stdio.h>
int a = 50;
int main(void)
{
    int a = 10;
    {
        int a = 20;
        int i;
        for (i = 0; i < 10; i++) {
            int a = 30;
        }
    }
    return 0;
}
于 2015-02-03T13:42:20.110 回答
0

您可以使用指针来访问和编辑 C 中的全局变量。

#include <stdio.h>
#include <stdlib.h>

int a;
a=78;
int *ptr=&a;            //pointer for global a
int main()
{
    int a=0;
    printf("%d",a);         //Prints 0 as local variable
    printf("%d",*ptr);
    ptr=30;      //changes the value of global variable through pointer
    printf("%d",*ptr);      //Now it prints 30
    return 0;
}
于 2018-02-17T16:40:46.023 回答