2012-05-20 2 views
0

내 프로젝트의 모든 소스 파일을 따라 증가하는 매크로를 정의하려고합니다. __COUNTER__ 매크로와 달리 모든 파일에 대해 별도입니다. 내가 좋아하는 클래스 뭔가 정적 멤버 변수를 사용하여 시도 :C++은 모든 파일을 따라 증가하는 카운터 매크로를 만듭니다.

class A{ 
static int GetNextNum() { 
number++; 
return number - 1; 
} 
private: 
    static int number; 
}; 
#define NEXT_NUM A::GetNextNum() 

하지만 결과는 내가 원하는 없습니다. 예를 들어 나는 (__COUNTER__ 그렇듯이)이주기의 각 반복에 대해 동일한 번호를 갖고 싶어 :

for (int i = 0; i < 10; ++i) { 
    doSomething(NEXT_NUM) 
} 

내가 impemented대로이 반복 될 때마다 증가하는 동안

. 어떻게하면 필요한 것을 얻을 수 있습니까? (저는 Visual Studio를 사용하고 있지만 컴파일러 독립적 인 솔루션을 선호합니다).

편집 : 여기에 요청한대로 내가하고 싶은 것과 비슷한 간단한 예가 있습니다. 나는 코드의 주어진 부분을 얼마나 많이 통과했는지를 세는 클래스를 정의하려고한다. 여기에 내가 이러한 클래스를 사용하는 것이 방법입니다 :이 또한 내가 소멸자의 추적 및 축적 기타 물건의 톤하지만 난 당신이 아이디어를 얻을이 충분 생각

for (int i = 0; i < 10; ++i) { 
    ExecuteCounter(location_id); 
    ... do stuff ... 
} 

. 처음에는 항목이 어디에있는지를 객체를 나타내는 곳에 사용했습니다. 문자열은 __FILE____LINE__을 붙임으로써 (따라서 위치를 고유하게 식별합니다), 느린 것으로 나타났습니다. 그래서 맵을 사용하는 대신 테이블과 인덱스를 사용하기로 결정했습니다. 이렇게하면 전반적인 복잡성에서 로그가 제거되고 성능이 크게 향상됩니다. 희망이 설명은 내 질문을 명확하게합니다.

+2

무엇이 필요합니까? –

+0

나는 그것이 생성 된 코드에서 각 위치에 대한 클래스의 별도 인스턴스를 만들고 있습니다. 필자는 인덱스 ('COUNTER')를 실제 개체에 매핑하는 테이블을 사용하여이 작업을 구현합니다. 그 외에 나는 호기심을 요구하고있다. –

+0

최소한 해결해야 할 문제 *를 게시하십시오. 더 좋은 방법이되어야합니다. –

답변

1

이렇게 간단할까요?

#include <stdio.h> 
int g_counter = 0; // make it visible to other files through 'extern' 
#define UPDATE_COUNTER() {\ 
         static int _this_counter_ = 0;\ 
         if (_this_counter_ == 0) {\ 
          g_counter++;\ 
          _this_counter_ = 1;\ 
         }\ 
        }\ 
int main() { 
    printf("Counter: %d\n", g_counter); 
    for (int i=0; i<100; i++) { 
     UPDATE_COUNTER(); 
    } 
    printf("Counter: %d\n", g_counter); 
    for (int i=0; i<100; i++) { 
     UPDATE_COUNTER(); 
    } 
    printf("Counter: %d\n", g_counter); 
} 

당신은 헤더 파일에 대한 통근을 선언하고 모든 소스 파일을 포함하여 다른 파일에 g_counter 볼 수 있습니다. 동일한 머리글은 UPDATE_COUNTER 매크로에도 좋습니다.

+0

다른 정적 변수에서 첫 번째 반복 (_this_counter가 0 일 때)의 g_counter 값을 UPDATE_COUNTER 값으로 저장하도록 코드를 수정해야했지만 내 문제를 해결하는 방법을 알려주었습니다. 고맙습니다. –

1

그래서 코드에서 위치를 몇 번이나 방문했는지 알고 싶습니다.

그런 일에 대한 기본적인 아이디어는 단순해야합니다. 매크로는 먼저 장소를 방문 할 때마다 증가하는 정적 변수의 선언으로 확장해야합니다.

static size_t my_count = 0; 
++my_count; 

멀티 스레딩이없는 경우 트릭을 수행합니다. (가지고있는 경우 새로운 원자 연산을 살펴보십시오.)

이제 계산의 최종 결과에 어딘가에서 액세스 할 수 있기를 바랍니다. 이것은 자신의 collector 타입의 또 다른 static 변수로 카운터의 주소와 생성자에 대한 명명 규칙을위한 응용 프로그램 문자열을받는 것이 가장 쉽습니다.

#define DO_ACCOUNTING(NAME)      \ 
do {            \ 
    static size_t my_count L = 0;     \ 
    static collector my_collector(&my_count, #NAME);\ 
    ++my_count; 
} while(0) 

do-while 물건은 당신이 당신의 이름 공간을 오염하지 않도록,이 변수는 범위가 단지입니다.

관련 문제