문제

C/C ++ 전처리 기 또는 템플릿을 얻을 수있는 방법이 있습니까? 또는 __file__ 및 __line__ 및 algh/hash 및 아마도 로그 또는 오류 메시지로 인용 할 수있는 단일 짧은 숫자로 빌드 숫자와 같은 다른 외부 입력을 얻을 수있는 방법이 있습니까?

(고객이 버그 보고서에서 인용 할 때 필요한 경우 (손실이있는 경우 후보자 목록)를 뒤집을 수있는 의도가 필요합니다.)

도움이 되었습니까?

해결책

해싱을 수행하고 코드를 만들려면 함수를 사용해야합니다. __LINE__ 그리고 __FILE__ C 전 처리기가 그러한 복잡한 작업을 수행 할 수 없으므로.

어쨌든, 당신은 이것에 의해 영감을 줄 수 있습니다 기사 다른 솔루션이 상황에 더 적합 할 수 있는지 확인하십시오.

다른 팁

글쎄 ... 당신은 다음과 같은 것을 사용할 수 있습니다.

((*(int*)__FILE__ && 0xFFFF0000) | version << 8 | __LINE__ )

완벽하게 독특하지는 않지만 원하는대로 효과가있을 수 있습니다. 그 or를 +로 바꿀 수 있으며, 이는 어떤 것들에 더 잘 작동 할 수 있습니다.

당연히, 실제로 해시 코드를 만들 수 있다면 아마도 그렇게하고 싶을 것입니다.

나는 내 프로젝트에 연쇄 평가가 필요했고 전문화 된 템플릿을 만들어 얻었습니다. __LINE__ 그리고 __FILE__ 그리고 IT를 생성 할뿐만 아니라 (stdout에 대한 컴파일로) 생성 (stdout)을 생성했습니다. 입력에 대한 템플릿 전문화가 해당 템플릿의 줄 번호를 초래했습니다. 이것들은 컴파일러를 통해 처음으로 수집 한 다음 코드 파일에 덤프하고 프로그램을 다시 컴파일했습니다. 그 당시 템플릿을 사용한 각 위치는 다른 숫자를 얻었습니다.

(C ++에서는 불가능할 수 있으므로 d로 완료되었습니다)

template Serial(char[] file, int line)
{
    prgams(msg, 
    "template Serial(char[] file : \"~file~"\", int line : "~line.stringof~")"
      "{const int Serial = __LINE__;");
    const int Serial = -1;
}

더 간단한 솔루션은 글로벌 정적 "오류 위치"변수를 유지하는 것입니다.

#ifdef DEBUG
#define trace_here(version) printf("[%d]%s:%d {%d}\n", version, __FILE__, __LINE__, errloc++);
#else
#define trace_here(version) printf("{%lu}\n", version<<16|errloc++);
#endif

또는 printf없이 .. tracepoint를 건너면 errloc을 증가시킵니다. 그런 다음 값을 디버그 빌드에 의해 뱉어내는 줄/번호/버전과 상관 관계가있을 수 있습니다.

해당 오류 위치는 빌드에 따라 변경 될 수 있으므로 버전 또는 빌드 번호를 포함해야합니다.

코드 경로를 재현 할 수 없다면 잘 작동하지 않습니다.

__file__는 프로그램의 상수 세그먼트에 대한 포인터입니다. 그 차이와 다른 상수의 차이를 출력하면 재배치 등과 무관 한 결과를 얻을 수 있습니다.

extern const char g_DebugAnchor;
#define FILE_STR_OFFSET (__FILE__ - &g_DebugAnchor)

그런 다음 그것을보고하거나 줄 번호 등과 어떤 식 으로든 결합 할 수 있습니다. file_str_offset의 중간 비트가 가장 흥미로울 수 있습니다.

글쎄, 당신이 사용자에게 메시지를 직접 표시하는 경우 (시스템에서 충돌 주소 나 기능을 표시하는 것과는 달리), 원하는 것을 정확하게 표시하지 못하게 할 것은 없습니다.

예를 들어:

typedef union ErrorCode {
    struct {
        unsigned int file: 15;
        unsigned int line: 12; /* Better than 5 bits, still not great
                                  Thanks commenters!! */
        unsigned int build: 5;
    } bits;
    unsigned int code;
} ErrorCode;

unsigned int buildErrorCodes(const char *file, int line, int build)
{
    ErrorCode code;
    code.bits.line=line   & ((1<<12) - 1);
    code.bits.build=build & ((1<< 5) - 1);
    code.bits.file=some_hash_function(file) & ((1<<15) - 1);

    return code.code;
}

당신은 그것을 사용합니다

buildErrorCodes(__FILE__, __LINE__, BUILD_CODE) 

16 진로 출력합니다. 해독하기가 그리 어렵지 않을 것입니다 ...

(편집자 - 주석가가 정확합니다. 줄 번호에 대해 5 비트를 지정하기 위해 견과류 였을 것입니다. 그러나 Modulo 4096, 오류 메시지가있는 라인은 충돌하지 않을 가능성이 높습니다. 빌드 용 5 비트는 여전히 괜찮습니다 - Modulo 32 수단은 Modulo 32 수단입니다. 32 개의 빌드만이 뛰어날 수 있으며 같은 줄에서 오류가 여전히 발생합니다.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top