2012-08-01 2 views

답변

1

어쩌면 이렇게 될까요?

test.cc:7 DBG(this is a test) 

편집 :

#include <stdio.h> 

#define DBG(X) printf(__FILE__":%d DBG("#X")\n", __LINE__) 

int main() 
{ 
    DBG(this is a test); 
} 

이는 출력을 생성 당신은 소스 파일에 액세스 할 수 있고, 또는 소스 파일을 저장하는 중. 파일을 저장 한 후에는 적절한 행을 인쇄하는 것이 쉽습니다. 한 가지 방법 : vector 지수는 0에서 시작하므로 그에 따라 DBG()를 사용하는 것이

#define PROGRAM_PRINT_INIT(X) \ 
    static ProgramPrint pp = ProgramPrint(X) 
#define DBG(X) std::cerr << "[" << pp.name << ":" << X << "]" \ 
         << pp.file[X] << std::endl 

struct ProgramPrint { 
    std::string name; 
    std::vector<std::string> file; 
    ProgramPrint (const char *filename) : name(filename) { 
     std::ifstream in(filename); 
     std::string line; 
     while (getline(in, line)) file.push_back(line); 
    } 
}; 

참고.

+0

아니요, 직접 줄 내용을 전달하지 않는 사람, 줄 번호 – myWallJSON

+0

예. 이것은 웅대합니다. – Lazik

0

그래, C/C++은 만들 수 없습니다. 그러나 이것은 당신이 실제로 얼마나 멀리 구부릴 수 있는지보고 싶다면 하나의 제안입니다.

테스트 할 test.cpp를 컴파일한다고 가정 해보십시오. 컴파일하기 전에 cstring 배열의 소스 코드 줄을 소스 코드 파일 앞에 추가해야합니다. 이것을 test_temp.cpp이라는 별도의 파일에서 수행 할 것이고 우리는 TEST_CODE 배열을 호출 할 것입니다.

다음 파일을 code.awk에 넣으십시오 (그러면 쉽게 재사용 할 수 있습니다).

ASCII 문자 기준은 '표'저자
BEGIN { 
    for (i = 0; i < 128; i++) { 
     table = sprintf("%s%c", table, i); 
    } 
    print("= {\"\"") 
} 
{ 
    printf(",\"") 
    for(j=1; j<=length($1); j++) { 
     c = substr($1,j,1) 
     printf("\\x%x", index(table, c) - 1) 
    } 
    printf("\"\n") 
} 
END { 
    printf("};\n") 
} 

,이 각 문자 (16 진수) ASCII 값을 사용하여 (예를 들어, '\ X41'A '의 경우) 등 탭 등의 재료의 경우에 그 소스 코드에있을 수 있지만 C/C++ 문자열 리터럴로 이스케이프해야합니다. 당신이 라인의 소스 코드 파일의 80을 얻기 위해 원하는 경우

은 (1 기), 당신이 쓰는 것

echo "char* TEST_CODE[]" > test_temp.cpp 
awk -f code.awk test.cpp >> test_temp.cpp 
cat test.cpp >> test_temp.cpp 
g++ -o test test_temp.cpp 
rm test_temp.cpp 

유형 (또는 메이크에서) 명령 줄에서 컴파일하려면

TEST_CODE[80] 

참고 전처리 기 명령 전에이 작업이 수행됩니다. 각 경우에 배열 이름을 TEST_CODE에서 변경하여 여러 파일 및 헤더 파일을 사용하여이 작업을 수행 할 수 있습니다.

이것은 구멍이 있지만 일반적으로 작동합니다.

주 : char */string 리터럴 변환으로 인해 g ++에서 발생하는 LOT 컴파일러 경고 일 수 있지만 -w 플래그로 해제 할 수 있습니다.