cpp(1)

명칭
cpp - GNU-C 호환의 컴파일러 프리프로세서

서식

cpp [-$] [-A predicate [( value )]] [-C] [-D name [= definition ]] [-dD] [-dM] [-I directory ] [-H] [-I-] [-imacros file ] [-include file ] [-idirafter dir ] [-iprefix prefix ] [-iwithprefix dir ] [-lang-c] [-lang-c++] [-lang-objc] [-lang-objc++] [-lint] [-M [-MG]] [-MM [-MG]] [-MD file ] [-MMD file ] [-nostdinc] [-nostdinc++] [-P] [-pedantic] [-pedantic-errors] [-traditional] [-trigraphs] [-U name ] [-undef] [-Wtrigraphs] [-Wcomment] [-Wall] [-Wtraditional]
    [ infile |-] [ outfile |-]

해설
C 프리프로세서는, 실제의 컴파일의 전에 프로그램을 변환하기 위해서 C 컴파일러로부터 자동적으로 이용된다 매크로 프로세서 입니다. 긴 기술을 간략 해 매크로로서 정의할 수가 있기 (위해)때문에, 매크로 프로세서로 불립니다. C 프리프로세서는, 이하의 4개의 기능을 제공합니다.

•   헤더 파일을 읽어들입니다. 이것은 프로그램에 짜넣어진다 (C 언어의) 선언이 들어간 파일입니다.

•   C 언어의 임의의 부분의 생략형으로서 매크로 (을)를 정의해, C 프리프로세서가 프로그램내의 모든 매크로를 그 정의로 옮겨놓습니다.

•   조건문의 처리를 합니다. 전용의 프리프로세서 명령을 이용해, 여러가지 조건에 따라 프로그램의 일부를 포함하거나 제외하거나 할 수 있습니다.

•   행 번호의 제어를 합니다. 원시 파일과 컴파일 된 중간 파일을 조합하거나 재어레인지 하거나 하는 프로그램을 이용하는 경우, 컴파일러에 오리지날의 소스의 몇행째일까를 알리기 위한, 행 번호 제어의 프리프로세서 명령을 이용할 수 있습니다.

C 프리프로세서는, 그 인플리맨트에 의해 섬세한 부분에 차이가 몇개인가 있습니다. GNU C 프리프로세서의 완전한 문서는, info 파일의 `cpp.info ', 혹은, 메뉴얼의 The C Preprocessor (을)를 참조해 주세요. 이 쌍방은 `cpp.texinfo '로부터 생성됩니다. GNU C 프리프로세서는 ANSI Standard C 의 슈퍼 세트와 되어 있습니다. ANSI Standard C 에서는, 오늘 C 프로그램으로 일반적으로 이용되고 있는 많은 (무해인) 구조가 인정되고 있지 않습니다. 이 비호환성은 유저에게 있어서는 불편하고, 그 때문에 GNU C preprocessor 에서는 이 기술을 디폴트로 받아들이도록(듯이) 만들어지고 있습니다. 엄밀하게 말하면, ANSI Standard C 로 하기 위해서(때문에)는 옵션으로서 `-trigraphs ', `-undef ', `-pedantic '를 붙이지 않으면 안됩니다. 그러나 경험칙으로부터, 엄밀한 ANSI Standard C 에 맞추어 이러한 설정을 행하면(자) 지장이 있는 경우가 많은 것을 알고 있습니다. 대부분의 경우는, C 프리프로세서는 명시적으로 실행할 필요는 없습니다. C 컴파일러가 자동적으로 실행해 주기 때문입니다. 그렇지만, 명시적으로 프리프로세서를 실행하는 것이 유효한 일이 개개에는 있습니다. C 프리프로세서 (은)는, 인수로서 infile (와)과 outfile 의 2 개의 파일명을 기대합니다. 프리프로세서는 `#include '로 지정한 파일과 함께 infile (을)를 읽어들입니다. 입력 파일의 편성으로 만들어진 출력은, 모두 outfile 에 쓰여집니다. infile (와)과 outfile 의 지정에 `- '를 사용할 수가 있습니다. infile 하지만 `- '이면 표준 입력으로부터 데이터를 읽어, outfile 하지만 `- '이면 표준 출력에 결과를 씁니다. 만약 outfile 혹은 양쪽 모두의 파일명이 생략 되었을 경우, 생략 된 파일 대신에 표준 입력과 표준 출력이 사용됩니다.

옵션
이하가 C 프리프로세서가 받아들이는 옵션의 일람입니다. 이러한 옵션은, 프리프로세서가 컴파일러로부터 기동되고 있는 경우에도 자동적으로 인도해지므로, C 프로그램을 컴파일 할 때에도 지정할 수가 있습니다.

-P  `# '-행 번호 그렇다고 하는 행 번호 정보를 프리프로세서의 출력에 포함하지 않습니다. 이것은, C 이외의 언어로 행 번호 정보가 포함되어 있으면(자) 에러를 일으키는 언어를 처리하는 경우에 유용하겠지요.

-C  코멘트를 삭제하지 않고, 그대로 출력 파일에 포함합니다. 매크로 호출의 인수에 나타나는 코멘트는 매크로 호출의 전개 후에 카피됩니다.

-traditional
    ANSI 가 아니고, 구형식의 C 의 문법으로서 해석합니다.

-trigraphs
    ANSI 표준의 새 그래프(trigraph) 구문을 처리합니다. 이것은 ANSI C 로 1 캐릭터를 표시하면(자) 정해진 `?? '로 시작되는 3 캐릭터의 줄입니다. 예를 들면, `??/ '는 `\' (을)를 나타내기 때문에, `'??/n' '는 개행 캐릭터의 캐릭터 정수가 됩니다. 엄밀하게 말하면, GNU C 프리프로세서의 `-trigraphs '옵션은 ANSI C 표준을 완전하게는 서포트하지 않습니다. 하지만, 보통 유저라면 그 차이를 눈치채는 일은 드물겠지요. 새 그래프에 대해, 더 이상 알고 싶다고는 생각하지 않지요?

-pedantic
    `#else '나 `#endif '의 후에 코멘트 이외의 텍스트가 대한다고 했을 경우에, ANSI C 표준으로 요구되는 경고를 출력합니다.

-pedantic-errors
    `-pedantic '를 닮아 있습니다만, 경고는 아니고 에러로 합니다.

-Wtrigraphs
    새 그래프가 있다고 경고를 출력합니다(다만, 새 그래프의 처리는 실시합니다).

-Wcomment

-Wcomments
    코멘트 개시 순차 순서인 `/* '가 코멘트중에 존재했다면 경고를 발생합니다 ( 양형식은 같은 효과를 가집니다).

-Wall
    `-Wtrigraphs '와 `-Wcomment ' (다만 `-Wtraditional '는 제외하다)를 지정한 것과 같습니다.

-Wtraditional
    ANSI 와 전통파의 C 로 다른 행동을 취하는 구문이 출현했을 경우에 경고를 발표합니다.

-I directory
    디렉토리 directory (을)를 헤더 파일을 검색하는 디렉토리 리스트의 말미에 추가합니다. 이 옵션은, 지정한 디렉토리가 시스템의 헤더 파일이 격납되고 있는 디렉토리보다 먼저 검색되므로, 유저 자신의 작성한 버젼으로 시스템이 제공하는 헤더 파일을 덧쓰기시킬 수도 있습니다. 1 개(살) 이상의 `-I '옵션을 사용하는 경우, 디렉토리는 왼쪽에서 오른쪽의 차례로 검색되어 표준의 시스템 헤더 파일은 그 후가 됩니다.

-I- `-I- '옵션보다 전으로 지정된 `-I '옵션으로 주어진 디렉토리는, `#include "file "'의 인클루드문의 경우에게만 검색됩니다. `#include < file >'에서는 검색되지 않습니다. 옵션 `-I- '의 후의 옵션 `-I '에 추가의 디렉토리가 지정되었을 경우, 그러한 디렉토리는 모든 `#include '문장으로 검색됩니다. 덧붙여 말한다면, `-I- '옵션을 지정하면(자), 커런트 디렉토리는 `#include "file "'문장에 대한 최초의 검색 디렉토리는 아니게 됩니다. 그러므로, 커런트 디렉토리는 명시적으로 `-I. '로서 지정되었을 경우에게만 검색되게 됩니다. `-I- '와 `-I. '를 양쪽 모두 지정하는 것으로, 어느 디렉토리가 커런트 디렉토리 의 전에, 혹은 후에 검색될까를 엄밀하게 지정할 수가 있습니다.

-nostdinc
    헤더 파일의 검색에 표준 시스템 디렉토리를 이용하지 않습니다. `-I '옵션으로 지정한 디렉토리(와 만약 적절하다면 커런트 디렉토리)가 검색됩니다.

-nostdinc++
    헤더 파일의 검색에 C++ 사양의 표준 디렉토리를 이용하지 않습니다. 하지만, 그 외의 표준 디렉토리는 검색합니다. (이 옵션은 libg++ 의 구축시에 이용됩니다. )

-D name
    name (을)를 기정도리의 매크로로서 `1 '에 정의합니다.

-D name=definition
    name (을)를 매크로로서 definition 에 정의합니다. definition 의 내용에 제한키가, 프리프로세서를 쉘나 쉘에 유사했다 프로그램으로부터 기동하고 있는 경우, 쉘의 문법 상의미를 가지는 스페이스 등의 캐릭터를 보호하기 위해(때문에), 그 쉘의 쿼트 문법을 사용할 필요가 있습니다. 만약, 1 개(살)의 name 에 대해서 복수의 `-D '를 지정했다면, 가장 우측의 정의가 유효가 됩니다.

-U name
    name (을)를 정의하지 않습니다. 동일한 name 에 대해서 `-U '와 `-D '의 쌍방이 지정되었을 경우, `-U '가 `-D '에 우선해, name (은)는 정의되지 않습니다.

-undef
    비표준의 매크로를 일절 정의하지 않습니다.

-A name(value)
    (#assert 명령와 같은 방법으로) 술어 name 에 토큰 리스트 value (을)를 아서트 합니다. 쉘의 명령행상에서는 괄호를 이스케이프 하자 마자 쿼트 하는 것을 잊지 말아 주세요. 기정도리의 assertion 모두를 취소하는데, `-A- '를 사용할 수 있습니다. 이것은 또, 기정도리의 매크로 모두를 무효로 합니다.

-dM 프리프로세서의 결과를 출력하는 대신에, 프리프로세서의 실행중에 정의된, 기정도리의 것도 포함한 모든 매크로의 `#define '명령의 리스트를 출력합니다. 이것은, 사용하고 있는 프리프로세서의 그 버젼으로, 어떤 매크로가 기정도리일까를 아는 방법을 제공해 줍니다. 거기에는, 하늘의 파일 `foo.h '를 이 옵션으로 처리해 보면 좋습니다.

    touch foo.h; cpp -dM foo.h

    (은)는 모든 기정도리 매크로의 값을 보여 주겠지요.

-dD `-dM '를 닮아 있습니다만, 2 개의 차이점이 있습니다. 이것은 기정도리 매크로를 출력 하지 않습니다 . 또, `#define '명령와 프리프로세스 결과의 쌍방 (을)를 출력합니다. 이러한 출력은 양쪽 모두 표준 출력에 행해집니다.

-M [-MG]
    프리프로세스의 결과를 출력하는 대신에, main 의 원시 파일의 의존성을 기술하는 make 규칙을 출력합니다. 프리프로세서는 원시 파일의 오브젝트 파일명, 코론, 그 모든 인클루드 파일명으로부터 완성되는 make 규칙을 출력합니다. 복수의 인클루드 파일이 있는 경우, 규칙은 `\\ '-개행으로 복수행에 단락지어집니다. `-MG '는, 찾아낼 수 없었던 헤더 파일은(컴파일의 도중에) 생성되어 원시 파일과 같은 디렉토리에 존재하는 것으로서 취급합니다. `-M '와 함께 지정하지 않으면 안됩니다. 이 기능은 자동적으로 Makefile 를 갱신하는데 사용합니다.

-MM [-MG]
    이것은 `-M '를 닮아 있습니다만, `#include "file "'로 인클루드 되는 파일만을 취급하는 점이 다릅니다. `#include <file >'로 인클루드 되는 시스템 헤더 파일은 무시됩니다.

-MD file
    이것도 `-M '를 닮아 있습니다만, 의존 정보가 `file '에 써내집니다. —`-MD '를 지정한 파일의 처리도 이것에 가세해 행해져 `-M '와 같이 통상의 처리를 억제할 것은 없습니다. gcc 를 실행하는 경우는 `file '인수를 지정 해서는 안됩니다. gcc 는, 입력 파일명의 말미의 `.c '를 `.d '로 옮겨놓은 파일명을 출력에 이용하기 때문입니다. Mach 에서는, `make '명령로 편리하게 복수의 파일을 1 개의 의존 규칙 파일에 정리하는 유틸리티 md 하지만 이용할 수 있습니다.

-MMD file
    `-MD '를 닮아 있습니다만, 유저의 헤더 파일만을 취급해, 시스템 헤더는 무시하는 점이 다릅니다.

-H  통상의 동작에 가세해, 사용된 헤더 파일의 파일명을 출력합니다.

-imacros file
    파일 file (을)를 입력으로서 처리합니다만, 표준의 입력 파일을 처리하기 전에 그 결과의 출력을 파기합니다. file 에 의해 생성되는 출력은 버려지기 (위해)때문에, `-imacros file '의 처리 결과의 영향은, file 안에 기술된 매크로가 메인의 입력 파일중에서 사용 가능하게 되는 것 뿐입니다. 프리프로세서는, `-imacros file '를 처리하기 전에, 명령행으로부터 주어진 모든 `-D '나 `-U '옵션을 평가합니다.

-include file
    파일 file (을)를, 표준의 입력 파일의 전에 처리해, 그 결과 출력을 인클루드 합니다.

-idirafter dir
    디렉토리 dir (을)를 제 2 인클루드 패스에 가세합니다. 제 2 인클루드 패스중의 디렉토리는, 메인 인클루드 패스 (옵션 `-I '에 의해 추가됩니다) 안에 헤더 파일을 찾은 결과 발견할 수 없었던 경우에 검색됩니다.

-iprefix prefix
    prefix (을)를, 그 후에 계속되는 `-iwithprefix ' 옵션용의 프레픽스로서 사용합니다.

-iwithprefix dir
    디렉토리를 제 2 인클루드 패스에 추가합니다. 디렉토리명은 prefix (와)과 dir (을)를 연결하는 것에 의해 얻을 수 있습니다. 여기서 prefix (은)는 `-iprefix '옵션에 의해 지정된 것입니다.

-lang-c

-lang-c++

-lang-objc

-lang-objc++
    소스의 언어를 지정합니다. `-lang-c++ '는, 프리프로세서에 C++ 의 코멘트문과 C++ 용의 추가의 디폴트 인클루드 디렉토리를 처리시켜, `-lang-objc '는, Objective C 의 `#import '지시문을 사용 가능하게 합니다. `-lang-c '는 명시적으로 이러한 기능의 분리를 지정해, `-lang-objc++ '는 쌍방을 이용 가능하게 합니다. 이러한 옵션은 컴파일러 드라이버 gcc 에 의해 생성됩니다만, `gcc '의 명령행으로부터 인도할 수 없습니다.

-lint
    코멘트중에 파묻힌, program checker lint 의 명령을 찾아내, 그러한 전에 `#pragma lint '를 묻습니다. 예를 들면, 코멘트 `/* NOTREACHED */ '는 `#pragma lint NOTREACHED'가 됩니다. 이 옵션은 직접 cpp (을)를 호출하는 경우에게만 사용할 수 있습니다. gcc (은)는, 명령행으로부터 이 옵션을 인도하지 않습니다.

-$  식별자중에서의 `$ '의 사용을 금지합니다. 이것은, 표준이 수정되기 이전은, C 표준에의 엄밀한 준거를 위해서(때문에) 있었습니다. 본옵션은, cpp (을)를 직접 부를 때 마셔 사용 가능합니다. gcc (은)는 명령행으로부터 이것을 건네주지 않습니다.

관련 항목
info ; The C Preprocessor , Richard M. Stallman. 안의 엔트리 `cpp'
gcc(1); info ; Using and Porting GNU CC (for version 2.0) , Richard M. Stallman. 안의 엔트리 `gcc'

COPYING
Copyright (c) 1991, 1992, 1993 Free Software Foundation, Inc.

Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.

Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.

Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that this permission notice may be included in translations approved by the Free Software Foundation instead of in the original English.