我正在阅读有关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()
函数中执行此操作?
答案 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;
}