Mở rộng bài toán biên dịch có điều kiện: các chỉ thị #ifdef TÊN, #ifndef TÊN, #else, #endif giờ đây có thể lồng nhau ở nhiều cấp tuỳ ý (một khối #ifdef có thể chứa bên trong nó các khối #ifdef/#ifndef khác, sâu bao nhiêu cấp cũng được).
Một dòng mã nguồn (không phải chỉ thị) được giữ lại khi và chỉ khi mọi khối điều kiện đang bao quanh nó (từ ngoài vào trong) đều đang ở nhánh được chọn (nhánh mà điều kiện #ifdef/#ifndef đúng, hoặc nhánh #else khi điều kiện ban đầu sai). Chỉ cần MỘT cấp bao quanh đang ở nhánh không được chọn, dòng đó bị loại bỏ, bất kể các chỉ thị lồng bên trong nó là gì (những chỉ thị lồng bên trong dòng bị loại vẫn phải được đọc và khớp cặp đúng theo cấu trúc, nhưng không ảnh hưởng gì đến việc dòng đó có được giữ hay không).
Dữ liệu đảm bảo mọi #ifdef/#ifndef đều có #endif khớp cặp hợp lệ (đúng cấu trúc ngoặc lồng nhau), mỗi khối có tối đa một #else.
Ví dụ: Với macro đã định nghĩa {A} và chương trình:
#ifdef A
line1
#ifdef B
line2
#else
line3
#endif
line4
#endif
Kết quả in ra là line1, line3, line4 (vì B không được định nghĩa nên nhánh #else bên trong được chọn, còn khối A bên ngoài luôn được chọn nên line4 cũng được giữ).
#ifdef TÊN, #ifndef TÊN, #else, #endif, hoặc một dòng mã nguồn khác không rỗng. Độ sâu lồng nhau tối đa 500.In ra các dòng mã nguồn còn được giữ lại (đã loại bỏ mọi dòng chỉ thị), theo đúng thứ tự xuất hiện ban đầu, mỗi dòng một dòng.
Ví dụ:
Đầu vào:
1
A
9
#ifdef A
line1
#ifdef B
line2
#else
line3
#endif
line4
#endif
Đầu ra:
line1
line3
line4
Đầu vào:
0
5
#ifdef X
#ifdef Y
inner
#endif
#endif
Đầu ra:
Đang tải editor...