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
'programing' 카테고리의 다른 글
SVN 모범 사례-팀 작업 (0) | 2020.08.21 |
---|---|
스레드 경합이란 무엇입니까? (0) | 2020.08.21 |
AngularJS를 사용한 양식의 동적 유효성 검사 및 이름 (0) | 2020.08.21 |
테이블 정의를 표시하는 T-SQL 쿼리? (0) | 2020.08.21 |
현재 실행 가능한 파일 이름을 어떻게 찾습니까? (0) | 2020.08.21 |