C언어: # Directives
C언어의 Directive들에 대한 유용한 정보를 정리했다.
용어
-
implementation
컴파일러 + C 프로그램을 실행하는 다른 소프트웨어 포함한 것을 지칭
-
hosted implementation
C99 표준을 따르는 모든 프로그램을 반드시 수용해야 한다.
-
freestanding implementation
복소수 타입이나 일부 표준 헤더를 지원하지 않아도 된다.
-
#include directive
#include
로 헤더 파일을 포함할 때, "파일명”
또는 <파일명>
의 형태 대신 다음과 같이 명시할 수 있다.
#include tokens
이때, tokens
는 preprocessing tokens (매크로 등)에 해당된다.
즉 #define tokens "file.h"
와 같은 macro definition이 있다고 가정하면,
tokens
는 preprocessing 과정에서 “file.h”
로 변환된다.
Macro Directives
기본적으로 preprocessor는 compiler와 마찬가지로 코드의 위에서부터 아래로 Directives를 처리한다.
Parameterized Macros 사용 시
#define identifier(arg1, ...) replacement-list
argument로 side effects가 발생하는 expression 등을 대입하지 않을 것! (error 발생 가능성 농후)
#
연산자
macro argument를!!!!!
string literal로 변환시켜준다. (Parameterized Macros 에서만 사용 가능)
ex)
#define DISP(f, x) printf(#f "(%g) = %g\n", (x), (f(x)))
에서 #f가 f로 전달된 인자를 스트링 리터럴로 변환시켜준다.
##
연산자
두 개의 token을 하나의 token으로 이어붙여준다.
parameterized macro에서 먼저 argument들로 token이 대체된 이후에 실행된다.
defined
연산자
defined(identifier)
해당 identifier가 macro expression으로 define되었는지 확인한다.
Predefined Identifiers
-
__func__
모든 함수가 접근 가능하다, 함수 이름을 string literal 형태로 나타낸다.
-
__LINE__
현재 줄 번호를 나타낸다. (정수)
-
__FILE__
현재 파일 이름을 나타낸다.
-
__DATE__
컴파일된 날짜 (“Mmm dd yyyy”)
-
__TIME__
컴파일된 시간 (“hh:mm:ss”)
-
__STDC__
1
if the compiler conforms to the C standard (C99 등) -
__STDC__HOSTED__
represents the constant 1 if the program is a hosted implementation
-
__STDC__VERSION__
컴파일러에 의해 인식된 C 표준 버전을 나타낸다.
C89:
199409L
C99:
199901L
Macros with 가변 숫자 Arguments (printf
와 scanf
처럼)
#define identifier(...) printf(__VA_ARGS__)
와 같이 사용한다.
-
__VA_ARGS__
is a special identifier that can appear only in the replacement list of a macro with a variable number of arguments.
__VA_ARGS__
에 대응되는 argument가 최소 하나는 있어야 한다. (빈 argument 가능)
#error
Directive
#error message
preprocessor가 해당 directive를 마주하면, message를 포함하는 에러 메시지를 출력하고 즉시 컴파일을 중단한다.