如何在C中指定范围?

时间:2012-03-04 21:44:52

标签: c variables scope

是否可以在C中指定范围?

int x = 5;

void setX(int x) {
    (this, self, etc).x = x;
}

我知道C中不能有thisself因为它不是对象。有没有办法做到这一点?

4 个答案:

答案 0 :(得分:5)

您可以使用extern来访问全局变量,如下所示:

int a = 10;

int foo(int a)
{
    int b;
    {
        extern int a;
        b = a;
    }
    //b now contains the value 10
}

答案 1 :(得分:3)

通常这样做的方法是通过将函数作为指向某种上下文的指针的附加参数来“模拟”OO:

struct state {
  int x;
}

void setX(struct state *ctx, int x) {
  ctx->x = x;
}

/* later ... */
struct state ctx;
setX(&ctx, 5);

编辑:我刚刚意识到您宁愿强制您的编译器显式分配给全局变量而不是本地参数。嗯,这是不可能的,但上面的例子说明了如何实现类似于其他编程语言的习惯。即使在C语言中,使用全局变量也不一定是个好主意。

答案 2 :(得分:3)

在你的例子中,你就是不能。文件范围对象x被块作用域对象x隐藏,您无法直接访问文件范围对象x(即,我的意思是不使用指向文件范围的一些指针{{ 1}})。

  

(C99,6.2.1p4)"如果标识符指定同名的两个不同实体   空间,范围可能重叠。如果是这样,一个实体(内部范围)的范围将是a   另一个实体范围的严格子集(外部范围)。在内部范围内,   identifier指定在内部作用域中声明的实体; 在外部范围内声明的实体在内部范围内隐藏(并且不可见)。"

编辑:请参阅@howardh回答,不使用指针,可以使用x说明符引用内部作用域中的文件范围对象。

来自Derek M. Jones的新C标准:

  

"可以通过使用指向它们的指针来引用不相交范围内的对象。通过使用链接,也可以在表示文件范围内的对象的标识符在嵌套块范围内可见,即使在中间范围内存在相同标识符的另一个声明。"

extern

答案 3 :(得分:0)

你可以用一些指针修改和放大器来完成它。宏:

int x;

#define setX(val) _actualSetX(&x, val);

void _actualSetX(int *xPtr, int x)
{
    *xPtr = x;
}