programing

C / C ++ 줄 번호

nasanasas 2020. 8. 21. 07:52
반응형

C / C ++ 줄 번호


디버깅 목적으로 C / C ++ 컴파일러 에서 줄 번호를 얻을 수 있습니까? (특정 컴파일러에 대한 표준 방식 또는 특정 방식)

예 :

if(!Logical)
    printf("Not logical value at line number %d \n",LineNumber);
    // How to get LineNumber without writing it by my hand?(dynamic compilation)

전 처리기 매크로 __LINE____FILE__. 미리 정의 된 매크로이며 C / C ++ 표준의 일부입니다. 전처리 중에 현재 행 번호와 현재 파일 이름을 나타내는 정수가 들어있는 상수 문자열로 각각 대체됩니다.

기타 전 처리기 변수 :

  • __func__: 함수 이름 (이것은 C99의 일부이며 모든 C ++ 컴파일러가 지원하는 것은 아닙니다)
  • __DATE__ : "Mmm dd yyyy"형식의 문자열
  • __TIME__ : "hh : mm : ss"형식의 문자열

코드는 다음과 같습니다.

if(!Logical)
  printf("Not logical value at line number %d in file %s\n", __LINE__, __FILE__);

C ++ 표준의 일부로 사용할 수있는 사전 정의 된 매크로가 있습니다. C ++ 표준의 섹션 16.8은 무엇보다도 __LINE__매크로를 정의합니다 .

__LINE__: 현재 소스 라인의 라인 번호 (10 진수 상수).
__FILE__: 소스 파일의 추정 이름 (문자열 리터럴).
__DATE__: 소스 파일 번역 일 (문자열 리터럴 ...)
__TIME__: 소스 파일 번역 시간 (문자열 리터럴 ...)
__STDC__:__STDC__ 사전 정의 여부
__cplusplus: 이름 __cplusplus은 199711L 값으로 정의됩니다. C ++ 번역 단위 컴파일

따라서 코드는 다음과 같습니다.

if(!Logical)
  printf("Not logical value at line number %d \n",__LINE__);

함수 이름, 클래스 및 줄 번호와 같은 디버그 정보도 포함한다는 점을 제외하면 printf () 와 동일한 동작으로 매크로를 사용할 수 있습니다 .

#include <cstdio>  //needed for printf
#define print(a, args...) printf("%s(%s:%d) " a,  __func__,__FILE__, __LINE__, ##args)
#define println(a, args...) print(a "\n", ##args)

이러한 매크로는 java stacktrace와 같은 정보를 포함하면서 printf () 와 동일하게 작동해야합니다 . 다음은 메인의 예입니다.

void exampleMethod() {
    println("printf() syntax: string = %s, int = %d", "foobar", 42);
}

int main(int argc, char** argv) {
    print("Before exampleMethod()...\n");
    exampleMethod();
    println("Success!");
}

결과는 다음과 같습니다.

main (main.cpp : 11) 이전 exampleMethod () ...
exampleMethod (main.cpp : 7) printf () 구문 : string = foobar, int = 42
main (main.cpp : 13) 성공했습니다!


사용 __LINE__(이중 밑줄 LINE 이중 밑줄의), 전처리는 발생되는 행 번호로 대체됩니다.


체크 아웃 __FILE____LINE__매크로


시도 __FILE__하고 __LINE__.
또한 찾을 수 __DATE__있고 __TIME__유용 할 수 있습니다 .
클라이언트 측에서 프로그램을 디버깅해야하므로 이러한 정보를 기록해야하는 경우가 아니면 일반 디버깅을 사용해야합니다.


나는 또한이 문제에 직면하고 있고 여기 에서 요청 된 다른 유효한 질문에 대한 답변을 추가 할 수 없기 때문에 문제에 대한 예제 솔루션을 제공 할 것입니다. 함수가 호출 된 줄 번호 만 가져 오기 템플릿을 사용하는 C ++.

배경 : C ++에서는 형식이 아닌 정수 값을 템플릿 인수로 사용할 수 있습니다. 이것은 템플릿 인수로 데이터 유형의 일반적인 사용과 다릅니다. 따라서 아이디어는 함수 호출에 이러한 정수 값을 사용하는 것입니다.

#include <iostream>

class Test{
    public:
        template<unsigned int L>
        int test(){
            std::cout << "the function has been called at line number: " << L << std::endl;
            return 0;
        }
        int test(){ return this->test<0>(); }
};

int main(int argc, char **argv){
    Test t;
    t.test();
    t.test<__LINE__>();
    return 0;
}

산출:

이 함수는 줄 번호 : 0에서 호출되었습니다.

the function has been called at line number: 16

One thing to mention here is that in C++11 Standard it's possible to give default template values for functions using template. In pre C++11 default values for non-type arguments seem to only work for class template arguments. Thus, in C++11, there would be no need to have duplicate function definitions as above. In C++11 its also valid to have const char* template arguments but its not possible to use them with literals like __FILE__ or __func__ as mentioned here.

So in the end if you're using C++ or C++11 this might be a very interesting alternative than using macro's to get the calling line.

참고URL : https://stackoverflow.com/questions/2849832/c-c-line-number

반응형