/ C, PROGRAMMING

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 (printfscanf처럼)

#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를 포함하는 에러 메시지를 출력하고 즉시 컴파일을 중단한다.