2011-03-18 7 views
1
#include <stdio.h> 

#define STR(x) #x 
#define STR2(x) STR(x) 
#define LINE_FILE ("Line " STR2(__LINE__) " of file " STR2(__FILE__)) 

int main(void) 
{ 
    const char *str = LINE_FILE; 

    printf("%s\n", str); 

    return 0; 
} 

이 STR (x는) 실제 LINEFILE를 인쇄 할 수있는 유일한 정의 방식인가 ???이 작업을 수행하는 더 간단한 방법이 있습니까?

답변

5
STR2(__FILE__) 

__FILE__ 이미 문자열 리터럴 : 여기 STR2를 사용할 필요가 없습니다.

#define LINE_FILE "Line " STR2(__LINE__) " of file " __FILE__ 
+0

덕분에 많이! 하지만 STR2 (__ LINE__)는 어떨까요? 이것은 정의를 사용하여 줄 번호를 인쇄하는 유일한 방법입니까? – GaryHull

+0

@ garihull : 행 번호를 문자열 리터럴로 변환하는 유일한 방법입니다. '__LINE__'은 문자열이 아닌 정수 값입니다. –

4

printf("Line %d of file %s\n", __LINE__,__FILE__);

+0

! 나는 정의를 사용하는 방법을 찾고있다! – GaryHull

0

하지 대답,하지만 어쩌면 :이 다른 문자열 리터럴와 연결 할 수 있도록 당신이 그렇게하기를 원한다면

또한 아마, 매크로에서 괄호를 제거해야 누군가 그것을 만들 수 있습니다. 당신은 "##"을 사용하여

을 매크로에서뿐만 아니라 문자열을 연결할 수 있습니다하지만이 작동하지 않습니다 마치 #define의

#define LINE_FILE "Line " ## (__LINE__) ## " of file " __FILE__ 

나머지는 제임스 McNellis에서 가져

관련 문제