Dokumen ini di bagian 2.6 Termasuk Dihitung memiliki paragraf berikut:
Jika garis meluas ke aliran token yang dimulai dengan token <, dan termasuk token>, maka token antara <dan yang pertama> digabungkan untuk membentuk nama file yang akan disertakan. Setiap spasi putih antara token dikurangi menjadi satu ruang; maka setiap ruang setelah inisial <dipertahankan, tetapi ruang trailing sebelum penutupan> diabaikan . CPP mencari file sesuai dengan aturan untuk angle-bracket termasuk.
Saya tahu ini adalah implementasi yang didefinisikan, tetapi mengapa harus seperti ini untuk GCC? Saya merujuk secara khusus pada kalimat yang disorot di atas.
EDIT
Saya baru saja memperhatikan bahwa paragraf ketiga sebelum yang dikutip di atas mengatakan sebagai berikut:
Anda harus berhati-hati saat mendefinisikan makro.
#define
menyimpan token, bukan teks. Preprosesor tidak memiliki cara untuk mengetahui bahwa makro akan digunakan sebagai argumen#include
, sehingga menghasilkan token biasa, bukan nama header. Ini tidak akan menimbulkan masalah jika Anda menggunakan double-quote include, yang cukup dekat dengan konstanta string. Namun, jika Anda menggunakan kurung sudut, Anda mungkin mengalami masalah .
Adakah yang tahu masalah apa yang ditunjukkan di sini?
sumber
Jawaban:
Saya kira implementor memilih cara paling sederhana ketika mereka mengimplementasikan fungsi ini, tanpa terlalu memikirkannya.
Tampaknya implementasi awal mendarat pada 2000-07-03 (dua dekade lalu!). Bagian yang relevan seperti ( sumber ):
Khususnya, itu pecah ketika melihat
CPP_GREATER
token (yaitu>
), sebelum menyimpan memori untuk token. Ini masuk akal, karena tidak perlu mengalokasikan memori ketika token tidak akan ditulis ke buffer.Kemudian, hanya setelah memori dicadangkan, preprocessor memeriksa apakah token telah mendahului spasi putih (
t->flags & PREV_WHITE
) dan ketika itu terjadi, menulis karakter spasi putih ke buffer.Akibatnya, dalam
< foo / bar >
, hanya spasi putih sebelumfoo
(yaitu, setelah awal<
)/
, danbar
disimpan.sumber
if (t->flags & PREV_WHITE) CPP_PUTC_Q (pfile, ' ');
bertentangan dengan apa yang dikatakan dalam dokumen: "Setiap spasi putih antara token dikurangi menjadi satu ruang; ..."?