내용 출처 : YES C (정보공학연구소 /생능출판사)
혼자 연구하는 C/C++ (SoEn.kr /와우북스)
Ⅰ. #과 ##
① #과 ##은 #define 전처리문에서만 사용되는 특수한 연산자이다.
② C언어 자체의 연산자는 아니기에 우선순위나 결합규칙등은 적용되지 않는다.
③ #(strizing operator)는 #define문의 인수앞에 사용되어, 피연산자를 문자열로 바꿔준다.
④ #과 형식 인수 사이의 공백, 형식 인수 다음의 공백은 무시된다. ex) #define(#exp) == #define(# exp) == #define(#exp ) == #define(# exp )
⑤ 실인수 내의 연속되는 공백은 하나만 인정된다. 실인수내에 있는 주석은 하나의 공백으로 치환된다.
⑥ 실인수 내에 확장열로 처리해야하는 문자가 있다면 알아서 앞에 확장열 시작문자인 \를 삽입해준다.
⑦ C언어는 2진수 표기법을 지원하지 않는데 이를 이용해서 2진수를 바로 사용하는 함수를 만들 수 있다.
방법) (stdlib.h 필요) #define BIN(#a, NULL, 2)
⑧ ##(merge operator)는 형식인수를 분리하여 각각 치환 한 후 공백을 제거하고 붙여서 하나의 토큰으로 만든다.
ex) #define defptype(type) typedef *p##type , #define a(a,b) a##b
⑨ ##는 치환될 때 주변의 공백을 무시한다. ex) a##b == a ## b
⑩ 주로 일관적인 타입 정의에 많이 사용된다. (8번의 첫번째 예시)
//#는 주변 문자열과 자동으로 합쳐주는 듯 하다.
ex) #define a(format,a) printf("%"#format, a)라고 선언시 a(g,a)로 호출하면 printf("%g",a);로 치환시켜주는 듯하다.
Ⅱ. #error, #line
① #error 전처리문은 지정한 에러메시지를 출력하고 컴파일을 중단시킨다.
② #error 표시할 에러 메시지 형태로 사용한다.
③ #error 전처리문과 조건부 전처리문을 함께 사용하면 특정 조건에서는 컴파일 하지 않고 에러를 표시하도록 할 수 있다.
④ #line 전처리문은 이하의 줄번호와 파일명을 원하는 것으로 변경시킨다.
⑤ #line 줄번호 "파일명" 형태로 사용하며 파일명은 생략할 수 있다. 생략시 현재 파일명으로 출력된다.
⑥ #line 전처리문은 사용자가 직접 사용하는 경우는 드물고 주로 컴파일러가 에러메시지를 조립을 위해 내부적으로 사용한다.