เป้าหมายคือการสร้างตัวประมวลผลล่วงหน้าสำหรับภาษา C ซึ่งมีขนาดเล็กที่สุดเท่าที่เป็นไปได้ในแง่ของขนาดซอร์สโค้ดเป็นไบต์ในภาษาที่คุณต้องการ อินพุตจะเป็นไฟล์ต้นฉบับ C และเอาต์พุตจะเป็นซอร์สโค้ดที่ถูกประมวลผลล่วงหน้า
รายการที่จะต้องสามารถดำเนินการได้คือ: การลบความคิดเห็น (บรรทัด / บล็อก), #include คำสั่ง (โดยการเปิดไฟล์ที่เส้นทางสัมพัทธ์และแทนที่ข้อความ ณ จุดที่ต้องการ), #define, #undef, #if, #elif, #else, #endif, #ifdef, #ifndef และกำหนด () คำสั่งตัวประมวลผลล่วงหน้า C อื่น ๆ เช่น #pragmas หรือ #errors อาจถูกละเว้น
ไม่จำเป็นต้องคำนวณนิพจน์ทางคณิตศาสตร์หรือตัวดำเนินการเปรียบเทียบในคำสั่ง #if เราถือว่านิพจน์จะประเมินเป็นจริงตราบใดที่มันมีจำนวนเต็มอื่นที่ไม่ใช่ศูนย์ (การใช้งานหลักจะเป็นไปตามคำสั่งที่กำหนดไว้) ตัวอย่างของการป้อนข้อมูลและเอาต์พุตที่เป็นไปได้ (ช่องว่างพิเศษที่เป็นไปได้ในไฟล์เอาต์พุตถูกตัดแต่งเพื่อให้มีลักษณะที่ดีขึ้นโดยไม่จำเป็นต้องใช้โค้ดในการทำเช่นนั้น) โปรแกรมที่สามารถประมวลผลตัวอย่างต่อไปนี้อย่างเหมาะสมจะได้รับการพิจารณาว่าเพียงพอ
----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
ความต้องการที่จะได้รับการสนับสนุน? เช่นตัวประมวลผลล่วงหน้าจำเป็นต้องสนับสนุนนิพจน์ที่มีเลขคณิตการดำเนินการระดับบิตและอื่น ๆ หรือไม่