많은 C언어 개발자가 전처리기 예약어나 전처리 연산자를 모르는 경우가 의외로 많습니다. 이를 활용하면 debug나 여러가지 면에서 활용성이 많습니다. 이들은 고급 프로그래머가 되기 위해서는 반드시 알아야 할 내용들입니다. 이를 알지 못하면 Framework나 솔루션 개발 등을 할 때에 debugging등에서 힘들어질 수 있습니다.
우선 전처리 예약어부터 알아보겠습니다. 이들은 변수명이나 상수명으로 사용하면 안됩니다.
__FILE__ : 현재 코딩하고 있는 소스 파일명 자체입니다.
__func__ : 현재 코딩하고 있는(__func__자체가 위치하고 있는 곳의) 함수명입니다.
__LINE__ : 현재 코딩하고 있는(__LINE__자체가 위치하고 있는 곳의) 라인번호입니다.
예를들면,
printf("%s:%s():%05d\n", __FILE__, __func__, __LINE__);
라고 출력을 여러군데, 해보시면 항상 다른 값이 출력됩니다.
위와 같이 출력하면...
mysource.c:main():00124
이런식으로 출력이 됩니다.
__FILE__, __func__, __LINE__ 는 debugging을 위한 log 파일 생성 시에 거의 필수적으로 사용되는 전처리 예약어입니다.
__DATE__ : 컴파일 시점의 날짜(ex. Jun 18 2016)
__TIME__ : 컴파일 시점의 시간(ex. 08:36:39)
예).
printf("%s/%s에 컴파일하였습니다.\n", __DATE__, __TIME__);
결과>
Jun 18 2016/08:36:39에 컴파일하였습니다.
위의 __DATE__, __TIME__ 예약어는 잘 사용하지 않지만, 가끔은 얘가 컴파일된 것이 적용되고 있는 거야 아닌거야하고 의심이 되실때에 사용하면 스트레스가 좀 해소될 듯 합니다.
#line 라인번호 ["파일명"]
파일명은 생략가능하고 __LINE__, __FILE__의 값도 #line에 의해서 영향을 받을 수 있습니다. 이 예약어는 컴파일러에게 프로그램의 소스 파일명과 소스의 라인 위치를 변경하게 합니다. 즉, 컴파일하다가 오류가 발생하면 무슨 소스의 몇번째 라인에 오류가 발생하였다고 출력하는 데, 만약 sample1.c의 소스에 #line 100 "sample2.c" 라고 하면 #line의 위치가 실제소스 파일은 sample1.c인데도 불구하고 sample2.c의 100번째 라인이고 그 다음 라인은 101라인이 됩니다. 그래서 컴파일을 하다가 오류가 발생하면 엉뚱하게 sample2.c의 150번째라인에서 컴파일 오류가 발생하였다고 나옵니다. 아니 쓸데없는 짓을 왜하냐?라고 말하는 분들이 계실겁니다.
이것을 응용하는 경우로는 대표적인 것이 Pro*C입니다.
우리가 오라클의 Pro*C로 sample.pc라는 소스로 코딩합니다. 그러면 proc 프리컴파일러로 컴파일하면 sample.c가 생성됩니다. 그리고 gcc로 다시 sample.c를 컴파일하여 실행파일을 만듦니다. 문제는 pro*c precompiler가 .c 파일을 생성할 때에 어마어마하게 많은 양의 소스코드를 삽입합니다. sample.pc는 몇라인 안되는 데 precompile하고 난 sample.c는 수천라인이 됩니다.
sample.pc를 개발한 개발자는 .c 소스는 관심이 없고 .pc만 관심이 있습니다. 컴파일하다가 오류가 나면 .pc의 몇번째라인에서 오류가 발생하였는 지가 중요하지 sample.c와 같은 중간 파일은 중요하지 않습니다. 그래서 pro*c precompiler가 .c 소스를 generation할 때에 #line pro*c소스라인번호 sample.pc라고 generation되는 .c의 소스의 곳곳에 넣어주기 때문에 우리가 gcc 컴파일 오류를 보게 되면 sample.pc 몇번째 라인 오류입니다라고 알 수 있습니다.
이것을 응용하면 어떤 영역을 C언어로 코딩하고 나머지 영역은 소스코드를 generation하는 tool을 만들 때에 이를 응용하면 코딩하는 개발자는 자신이 코딩한 소스의 관점에서 오류를 잡으면 됩니다.
'C언어 > 문법' 카테고리의 다른 글
C Programming Language 문법 (11) | 2019.12.08 |
---|---|
35. 전처리기(Preprocessor) - 전처리 연산자 (4) | 2019.12.08 |
33. 전처리기(Preprocessor) - 조건부 컴파일 (0) | 2019.12.08 |
32. 전처리기(Preprocessor) - 기초 (0) | 2019.12.08 |
31. 열거형(enum) - 정수형 상수 그룹 (0) | 2019.12.07 |