Chỉ thị tiền xử lý #ifdef TÊN giữ lại đoạn mã phía sau nếu TÊN đã được định nghĩa (nằm trong danh sách macro đã #define, không quan tâm giá trị), ngược lại đoạn mã đó bị loại bỏ. #ifndef TÊN có ý nghĩa ngược lại: giữ lại nếu TÊN chưa được định nghĩa. Chỉ thị #else (nếu có) đánh dấu nhánh thay thế, và #endif kết thúc khối điều kiện.
Cho tập hợp các macro đã định nghĩa (chỉ cần biết tên, không cần giá trị) và một "kịch bản" tiền xử lý gồm các dòng lệnh không lồng nhau (mỗi khối #ifdef/#ifndef ... [#else] ... #endif là độc lập, không có khối nào nằm bên trong khối khác), xen kẽ với các dòng mã nguồn thông thường. Hãy in ra đúng các dòng mã nguồn còn sót lại sau khi tiền xử lý, giữ nguyên thứ tự ban đầu.
Ví dụ: định nghĩa DEBUG; kịch bản
#ifdef DEBUG
printf("debug on");
#else
printf("release");
#endif
vì DEBUG đã định nghĩa nên kết quả chỉ in ra dòng printf("debug on");.
Dòng đầu chứa số nguyên n (0≤n≤100) — số macro đã định nghĩa. n dòng tiếp theo, mỗi dòng là tên một macro (các tên đôi một khác nhau). Dòng tiếp theo chứa số nguyên m (0≤m≤300) — số dòng của kịch bản tiền xử lý. m dòng tiếp theo, mỗi dòng là một trong: #ifdef TÊN, #ifndef TÊN, #else, #endif, hoặc một dòng mã nguồn bất kỳ không bắt đầu bằng ký tự #. Dữ liệu đảm bảo các khối #ifdef/#ifndef ... #endif không lồng nhau và hợp lệ (mỗi khối mở có đúng 1 #endif tương ứng, #else nếu có chỉ xuất hiện đúng 1 lần trong mỗi khối).
In ra các dòng mã nguồn còn lại sau khi tiền xử lý, theo đúng thứ tự xuất hiện ban đầu, mỗi dòng một dòng. Nếu không còn dòng nào, không in gì.
Ví dụ:
Đầu vào:
1
WINDOWS
5
#ifdef DEBUG
printf("debug on");
#else
printf("release");
#endif
Đầu ra:
printf("release");
Đầu vào:
2
DEBUG
LINUX
5
#ifdef DEBUG
printf("debug on");
#else
printf("release");
#endif
Đầu ra:
printf("debug on");
Đang tải editor...