Tujuannya adalah untuk membuat preprosesor untuk bahasa C, sekecil mungkin dalam hal ukuran kode sumber dalam byte , dalam bahasa pilihan Anda. Inputnya akan berupa file sumber C, dan outputnya akan menjadi kode sumber yang sudah diproses.
Item-item yang harus dapat diproses adalah: Penghapusan komentar (baris / blok), # sertakan arahan (dengan membuka file di jalur relatif dan mengganti teks pada titik yang diperlukan), #define, #undef, #if, #elif, #else, #endif, #ifdef, #ifndef, dan defined (). Arahan preprocessor C lainnya seperti #pragmas atau #errors dapat diabaikan.
Tidak perlu menghitung ekspresi aritmatika atau operator pembanding dalam arahan #jika kita mengasumsikan ekspresi akan bernilai true asalkan berisi bilangan bulat selain nol (penggunaan utamanya adalah untuk direktif yang didefinisikan ()). Contoh kemungkinan input dan output yang diikuti (kemungkinan spasi putih tambahan dalam file output dipangkas untuk penampilan yang lebih baik, tidak perlu kode Anda untuk melakukannya). Suatu program yang dapat memproses contoh-contoh berikut dengan benar akan dianggap memadai.
----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
perlu didukung? yaitu apakah preprocessor perlu mendukung ekspresi dengan aritmatika, operasi bitwise, dll?