목표는 원하는 언어로 소스 코드 크기 (바이트 단위) 로 가능한 작은 C 언어 용 프리 프로세서를 작성하는 것입니다 . 입력은 C 소스 파일이되고 출력은 사전 처리 된 소스 코드가됩니다.
처리 할 수있는 항목은 다음과 같습니다. 주석 제거 (라인 / 블록), #include 지시문 ( 상대 경로에서 파일 을 열고 필요한 지점에서 텍스트를 대체하여), #define, #undef, #if, #elif, #else, #endif, #ifdef, #ifndef 및 defined (). #pragmas 또는 #errors와 같은 다른 C 전 처리기 지시문은 무시해도됩니다.
#if 지시문에서 산술 표현식이나 비교 연산자를 계산할 필요가 없습니다.식이 0 이외의 정수를 포함하는 한 표현식이 true로 평가된다고 가정합니다 (주로 사용하는 것은 defined () 지시문에 사용됨). 가능한 입력 및 출력의 예는 다음과 같습니다 (출력 파일에 추가 공백이 더 잘 보이도록 잘려서 코드를 작성할 필요가 없습니다). 다음 예제를 올바르게 처리 할 수있는 프로그램이면 충분합니다.
----Input file: foo.c (main file being preprocessed)
#include "bar.h" // Line may or may not exist
#ifdef NEEDS_BAZZER
#include "baz.h"
#endif // NEEDS_BAZZER
#ifdef _BAZ_H_
int main(int argc, char ** argv)
{
/* Main function.
In case that bar.h defined NEEDS_BAZ as true,
we call baz.h's macro BAZZER with the length of the
program's argument list. */
return BAZZER(argc);
}
#elif defined(_BAR_H_)
// In case that bar.h was included but didn't define NEEDS_BAZ.
#undef _BAR_H_
#define NEEDS_BARRER
#include "bar.h"
int main(int argc, char ** argv)
{
return BARRER(argc);
}
#else
// In case that bar.h wasn't included at all.
int main()
{return 0;}
#endif // _BAZ_H_
----Input file bar.h (Included header)
#ifndef _BAR_H_
#define _BAR_H_
#ifdef NEEDS_BARRER
int bar(int * i)
{
*i += 4 + *i;
return *i;
}
#define BARRER(i) (bar(&i), i*=2, bar(&i))
#else
#define NEEDS_BAZZER // Line may or may not exist
#endif // NEEDS_BARRER
#endif // _BAR_H_
----Input file baz.h (Included header)
#ifndef _BAZ_H_
#define _BAZ_H_
int baz(int * i)
{
*i = 4 * (*i + 2);
return *i;
}
#define BAZZER(i) (baz(&i), i+=2, baz(&i))
#endif // _BAZ_H_
----Output file foopp.c (no edits)
int baz(int * i)
{
*i = 4 * (*i + 2);
return *i;
}
int main(int argc, char ** argv)
{
return (baz(&argc), argc+=2, baz(&argc));
}
----Output file foopp2.c (with foo.c's first line removed)
int main()
{return 0;}
----Output file foopp3.c (with bar.h's line "#define NEEDS_BAZZER" removed)
int bar(int * i)
{
*i += 4 + *i;
return *i;
}
int main(int argc, char ** argv)
{
return (bar(&argc), argc*=2, bar(&argc));
}
#if
지원해야합니까? 즉, 전처리 기는 산술, 비트 연산 등의 식을 지원해야합니까?