2012-10-29 3 views
0
#include <stdio.h> 

void func() { 
    static int x = 0; // x is initialized only once across three calls of 
         //  func() 
    printf("%d\n", x); // outputs the value of x 
    x = x + 1; 
} 

int main(int argc, char * const argv[]) { 
    func(); // prints 0 
    func(); // prints 1 
    func(); // prints 2 

    // Here I want to reinitialize x value to 0, how to do that ? <-- this line 
    return 0; 
} 

위의 코드에서 func()를 3 번 ​​호출 한 후 x을 0으로 다시 초기화하려고합니다. 0으로 다시 초기화하는 방법이 있습니까?외부에서 로컬 정적 변수 값을 변경하는 방법

+1

'func()'을 선언하면 다시 초기화 할 것인지 아닌지 알려주는 인수를 사용할 수 있습니다. 예 : 'void func (const bool reset = false) {...}'. – jogojapan

+0

@jogojapan 잘 기술적으로 전역 int 포인터를 선언하고 x ..로 설정할 수 있지만 바람직하지 않은 것 같습니다. – Ancurio

+0

@Ancurio 예, 물론이를 수행하는 다양한 방법이 있습니다. 필자가 함수 매개 변수를 제안한 이유는'func'을 사용하여'x'의 값에 대한 궁극적 인 권위를 유지한다는 것입니다. 왜냐하면 그것이 로컬 정적 변수이기 때문에 적절합니다. – jogojapan

답변

0

수 없습니다. func() 외부에서 보이지 않는 로컬 정적 변수입니다.

다음 중 하나를 수행 할 수 있습니다 사용 :

  1. 글로벌 정적 (일반적으로 권장되지 않음).
  2. 참조/포인터 매개 변수를 통해 전달하거나 참조로 반환하십시오.
0

당신은 func() 외부 func()에서 볼의 포인터로 변수의 주소를 할당 할 수 있습니다.

변수를 재설정하려면 func()에 전달할 수있는 특수 매개 변수를 사용할 수 있습니다.

실제로, x 안에 func()을 선언하는 요령은 func()의 본문에서만 볼 수 있도록하는 것입니다. x을 수정할 수있게하려면 다른 위치에 정의하십시오. C++을 작성하고 있으므로, x은 어떤 클래스의 정적 멤버가되는 것이 좋습니다.

2

세 번 호출 한 후 항상으로 카운터를 재설정 하시겠습니까? 또는 호출자에게 임의의 시간에 카운트를 재설정 하시겠습니까?

이 이전하는 경우, 당신은 이런 식으로 작업을 수행 할 수 있습니다

void func() { 
    static int x = 0; 
    printf("%d\n", x); 
    x = (x + 1) % 3; 
} 

는 로컬 정적 변수를 사용하는 것은 아마도 나쁜 선택 후자 인 경우;

class Func 
{ 
    int x; 
    // disable copying 

public: 
    Func() : x(0) {} 

    void operator() { 
    printf("%d\n", x); 
    x = x + 1; 
    } 

    void reset() { 
    x = 0; 
    } 
}; 

Func func; 

당신은 그것을해야하거나 두 개의 서로 다른 카운터를 증가 두 개체를 피하기 (또는 싱글 만들기), 또는 카운터에 정적 구성원으로 비 복사 가능한 모든 있도록 : 대신 다음 디자인을 사용할 수 있습니다 개체가 동일한 카운터를 증가시킵니다. 이제 다음과 같이 사용하십시오 :

int main(int argc, char * const argv[]) { 
    func(); // prints 0 
    func(); // prints 1 
    func(); // prints 2 

    func.reset(); 
    return 0; 
}