2012-03-04 7 views
2

범위를 C로 지정할 수 있습니까?C에서 범위를 지정하는 방법은 무엇입니까?

int x = 5; 

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

가 나는 객체가 아니기 때문에 C에서 this 또는 self이있을 수 없음을 알고있다. 이 일을 할 수있는 방법이 있습니까?

struct state { 
    int x; 
} 

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

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

편집 : 난 그냥 실현 당신이 아니라 원하는

+1

'this' 또는 'self'는 범위에 영향을 미치지 않습니다. C에서의 동등 물은'struct' 객체이며 * members *도 있습니다 (예를 들어'.x'는 * member *를 나타내고 x는 * variable *를 나타냅니다). 범위는 특정 구문 구문을 통해 제어됩니다. 거의 모든 곳의 중괄호 ('{}) '가 발생합니다. –

답변

5

당신은 같은 전역 변수에 액세스 할 extern를 사용할 수 있습니다

int a = 10; 

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

이 일반적으로 수행하는 방법은 상황의 어떤 종류를 추가 인수로 포인터를 기능을 제공하여 OO "를 모방"하는 것입니다 컴파일러가 로컬 인수 대신 전역 변수에 명시 적으로 할당하도록합니다. 음, 이것은 불가능하지만 위의 예는 다른 프로그래밍 언어에서 익숙한 것과 비슷한 것을 얻을 수있는 방법을 보여줍니다. C에서도 전역 변수를 사용하는 것은 좋은 생각은 아닙니다.

3

예를 들어, 당신은 할 수 없습니다. 파일 범위 객체 x은 블록 범위 객체 x에 의해 숨겨져 있으며 파일 범위 객체 x에 직접 액세스 할 수 없습니다. 즉, 파일 범위 x에 대한 포인터를 사용하지 않고 파일 범위 객체에 직접 액세스 할 수 없습니다.

는 식별자가 동일한 이름으로 공간을 두 개의 서로 다른 엔티티들을 지정하는 경우, 범위가 겹치 (C99, 6.2.1p4) ". 경우에 따라서, 하나의 엔티티 (내측 영역)의 범위는 것 외부 범위의 엄격한 하위 집합 (외부 범위) 내부 범위 내에서 식별자는 내부 범위에서 선언 된 엔터티를 지정하고 외부 범위에서 선언 된 엔터티는 내부 범위 내에서 숨겨집니다 (표시되지 않음). 범위. "

편집 : 포인터를 사용하지 않고 extern 지정자를 사용하여 내부 범위의 파일 범위 객체를 참조 할 수 있으므로 @howardh 대답을 참조하십시오. 데릭 M. 존스 새로운 C 표준에서

:

"그들에게 포인터를 사용하여 분리 된 범위에있는 객체를 참조 할 수 있습니다 그것은이를 위해, 연결의 사용을 통해 가능하다. 중간 범위에 동일한 식별자의 또 다른 선언이 있어도 중첩 된 블록 범위 내에서 볼 수있는 파일 범위의 객체를 나타내는 식별자입니다. "

extern int glob; 

void f1(void) 
{ 
    int glob = 0; 
    { 
     extern int glob; /* Refers to same object as file scope glob. */ 
     glob++; 
    } 
    /* Visible glob still has value 0 here. */ 
} 
0

당신은 몇 가지 포인터를 엉망으로 & 매크로와 함께 할 수 있습니다 :

int x; 

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

void _actualSetX(int *xPtr, int x) 
{ 
    *xPtr = x; 
} 
관련 문제