C语言中是否有范围解析运算符?

时间:2015-02-03 13:35:32

标签: c scope-resolution

我正在阅读有关C语言的书('掌握C' ),并在第203页上找到了关于范围解析运算符(::)的主题,在Google图书上here

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

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

因此,如果我想访问全局变量,那么我该如何在main()函数中执行此操作?

6 个答案:

答案 0 :(得分:15)

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

您询问如何从函数(此处为a)中访问全局变量main,该函数具有自己的局部变量a。你不能用C语言做到这一点。它在词法上超出了范围。当然你可以把变量的地址带到其他地方并将其作为指针传递,但这完全是另一回事。只需重命名变量,即'不要那样做'

答案 1 :(得分:7)

不,命名空间是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;
}
但是,这有点棘手。这是糟糕的风格。不要那样做。

答案 2 :(得分: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的值,则取消引用指针。

答案 3 :(得分:3)

否(::运算符是特定于C ++的)。在C中,如果在不同的重叠范围(例如,文件范围a和块范围a)中使用相同的标识符,则块范围标识符阴影文件范围标识符和没有办法引用阴影标识符。

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

答案 4 :(得分: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;
}

答案 5 :(得分: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;
}