Mục tiêu là tạo ra một bộ tiền xử lý cho ngôn ngữ C, càng nhỏ càng tốt về kích thước mã nguồn theo byte , bằng ngôn ngữ ưa thích của bạn. Đầu vào của nó sẽ là một tệp nguồn C và đầu ra của nó sẽ là mã nguồn được xử lý trước.
Các mục mà nó sẽ cần để có thể xử lý sẽ là: Xóa nhận xét (dòng / khối), #include chỉ thị (bằng cách mở tệp tại các đường dẫn tương đối và thay thế văn bản tại điểm cần thiết), #define, #undef, #if, #elif, #else, #endif, #ifdef, #ifndef và được xác định (). Các chỉ thị tiền xử lý C khác như #pragmas hoặc #errors có thể bị bỏ qua.
Không cần tính toán các biểu thức số học hoặc toán tử so sánh trong các lệnh #if, chúng tôi giả sử biểu thức sẽ đánh giá là đúng miễn là nó chứa một số nguyên khác 0 (sử dụng chính của nó sẽ là chỉ thị () được xác định). Ví dụ về các đầu vào và đầu ra có thể theo sau (các khoảng trắng bổ sung có thể có trong các tệp đầu ra đã được cắt bớt để xuất hiện tốt hơn, không cần mã của bạn để làm như vậy). Một chương trình có thể xử lý các ví dụ sau đúng sẽ được coi là đủ.
----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
nhu cầu cần được hỗ trợ? tức là bộ tiền xử lý có cần hỗ trợ các biểu thức với các phép toán số học, bitwise, v.v. không?