2010-04-16 4 views
6

다음 코드는 스스로 문제가 있기 때문에 문제가 있습니다.
로그 [선 : 10] [: 5 라인]
로그 [선 :
그러나이 사실이
로그인을 5 :
스스로 호출하는 lineno를 얻을 수 있습니까? (C/C++)

1 #include<stdlib.h> 
2 #include<stdio.h> 
3 void log() 
4 { 
5   printf("Log [Line:%d]\n",__LINE__); 
6 } 
7 int main() 
8 { 
9   log(); 
10  log(); 
11 } 

예상되는 결과는
로그 [9 선]입니다 ]

LINE 5.
로 사전 프로세스 단계에서 대체 된 내 질문은 놀라운 아니오 , 로그 함수를 설계하여 예상 결과를 얻는 방법은 무엇입니까?
감사합니다.

답변

15

당신은 매크로를 작성해야합니다

#define LOG printf("Log [Line:%d]\n",__LINE__) 

는 다음을 사용 :

매크로가 __LINE__ 매크로 올바른 값을 제공, 사용의 시점에서 확장되기 때문 작동
int main() { 
    LOG; 
    LOG; 
} 

.

+0

를 C++의 경우, 당신은 또한 인라인 함수를 사용할 수 있습니다. – waffleman

+3

@waffleman 컴파일러가 코드를보기 전에 매크로 확장 ('__LINE__' 매크로)을 할 수 없습니다. –

+0

인라인 함수가 작동하지 않습니다 -'__LINE__'은 선행 처리기 매크로이므로 함수 인라이닝 중에는 전 처리기 대신 사용됩니다. (편집 : ninja'd) – AshleysBrain

4

매크로는 호출 된 함수의 매개 변수로 __LINE__을 전달하여이를 극복 할 수 있습니다.

또 다른 보완적인 방법은 매개 변수로 함수에 일부 컨텍스트를 전달하는 것입니다. 기본값은 '줄 번호 사용'입니다. 이것은 패턴 오류 처리를하고이 코드에 의해 설명된다

int read_byte(FILE* f,int line=0) { 
    int ret = fgetc(f); 
    if(-1 == ret) 
    throw (line? line: __LINE__); 
    return ret; 
} 

int read_uint16(FILE* f,int line=0) { 
    int hi = read_byte(f,(line? line: __LINE__)); 
    int lo = read_byte(f,(line? line: __LINE__)); 
    return (hi<<8)|lo; 
} 

int main() { 
    ... 
    try { 
    int i = read_uint16(f,__LINE__); 
    } catch(int line) { 
    fprintf(stderr,"Error at line %d\n",line); 
    } 
    ... 
} 

마지막으로, (특히 오류 처리의 경우) C/C++ 코드에서 스택 트레이스를 취득하고자하는이 모든 난다. 당신은 약간의 기존 기능을 수정 및 매크로에 포장 할 수 VALGRIND_PRINTF_BACKTRACE(format, ...)

1

봐 :

#include<stdlib.h> 
#include<stdio.h> 

#define log() real_log(__LINE__) 

void real_log(int line) 
{ 
     printf("Log [Line:%d]\n", line); 
} 

int main() 
{ 
     log(); 
     log(); 
} 
관련 문제