2013-10-17 3 views
8

클래스 (C++) 또는 모듈 (단일 C 파일)이 있다고 가정 해 보겠습니다. 다음 함수 중 하나에서 변수의 복사본을 저장하고 다음에 함수가 호출 될 때까지 값을 보유하려면 전역 (C++에서 개인이 될 수 있고 유지할 C에서 extern되지 않을 수 있습니다. 모듈 범위에서) 또는 로컬 정적 변수를 만드시겠습니까?지속 변수를 생성하려면 로컬 정적 변수 또는 전역 변수를 갖는 것이 더 낫습니다.

예컨대 :

void some_func_that_does_not_do_anything_useful(int arbVal) 
{ 
    static int lastArbVal = 0; 

    if (arbVal > lastArbVal) 
    { 
     lastArbVal = arbVal; 
    } 
} 

내가 정적 가능한 한 제한으로 그 범위를 유지하는 것입니다,하지만 내가 읽은 어떤 일이이를 위해 전역을 사용해야 제안 할 것입니다 이유는, 그래서 지금은 혼란 스러워요.

무엇이 가장 좋습니까 (있는 경우)?, 찬성/반대 하시겠습니까?

+2

그 기능에서만 사용하고 다른 곳에서는 사용하지 않으면 '정적'으로 설정하는 것이 가장 좋은 해결책 일 수 있습니다. 정적 변수가 모든 스레드간에 공유되므로 멀티 스레딩과 같은 사례를 생각할 수도 있습니다. –

+0

캡슐화를 위해 로컬 정적이 가장 좋습니다. 이것은 많은 C 함수가 취하는 접근법이기도합니다. 'strtok'이 떠오른다. – Adam

+1

'strtok' man 페이지에서 인용하자면 : "절대 사용하지 마라." 이것을 어떻게 사용하는지에 대한 예제로 사용하지 않겠습니다 :-) –

답변

10

규칙은 간단합니다. 변수에 둘 이상의 함수가 액세스해야하는 경우 전역 변수로 만듭니다. 그렇지 않은 경우 함수 내의 변수가 일반적으로 더 좋습니다 (예 : static). 전문가 중 하나는 전역 네임 스페이스를 오염시키지 않는 것입니다. 전역 변수는 파일 외부에 액세스 할 필요가없는 경우,이 파일 범위 변수로 선언하는 것이 좋습니다 (즉, static로 선언) 것을

참고 위로 예

, 내 생각 이미 사용한 것처럼 static 변수를 사용하는 것이 가장 좋습니다.

+1

파일 스코프'static'의 대안은 익명의 네임 스페이스입니다. – juanchopanza

+2

'static'파일 범위는 정적 초기화 순서에 적합하지 않을 수도 있습니다. 다른 변환 단위에서 다른 통계를 초기화하는 동안이 함수를 사용하는 함수가 호출되면 문제가 발생합니다. – jrok

관련 문제