Rumah >pembangunan bahagian belakang >C++ >Mengapakah `xstr(foo)` Output '4' Manakala `str(foo)` Output 'foo' dalam Pengembangan Makro seperti C?

Mengapakah `xstr(foo)` Output '4' Manakala `str(foo)` Output 'foo' dalam Pengembangan Makro seperti C?

Linda Hamilton
Linda Hamiltonasal
2024-12-28 14:30:11210semak imbas

Why Does `xstr(foo)` Output

Memahami Stringifikasi: Langkah Utama Pengembangan Makro

Konsep rentetan dalam bahasa seperti C membolehkan anda menukar ungkapan kepada rentetan. Memahami langkah-langkah yang terlibat dalam proses ini adalah penting untuk penggunaan makro yang berkesan.

Masalah: Perbezaan dalam Output

Pertimbangkan definisi makro berikut:

#define foo 4
#define str(s) #s

Apabila anda menggunakan str(foo) dalam kod anda, ia akan mengeluarkan "foo" kerana rentetan (langkah 1) dilakukan sebelum pengembangan teks (langkah 2).

Walau bagaimanapun, jika anda mentakrifkan makro tambahan:

#define xstr(s) str(s)

Dan gunakan xstr(foo), outputnya akan menjadi "4". Perbezaan ini memerlukan penerokaan proses rentetan.

Langkah-langkah Pengembangan Makro

Proses pengembangan makro melibatkan beberapa langkah, mengikut piawaian C dan C:

  1. Praproses: Token didahului oleh # atau ## adalah diproses.
  2. Penggantian Argumen: Makro digunakan pada setiap hujah.
  3. Penggantian Parameter: Parameter digantikan dengan hasil makro yang sepadan.
  4. Pengimbasan semula: Kod diimbas semula untuk makro selanjutnya pengembangan.

Menggunakan Langkah untuk xstr(foo)

  1. Praproses: Tiada token yang berkenaan.
  2. Penggantian Hujah: foo digantikan dengan 4.
  3. Penggantian Parameter: Dalam str(s), s digantikan dengan 4, menghasilkan str(4).
  4. Pengimbasan semula: str (4) diimbas semula, menghasilkan output "4".

Mengapa str(foo) Menghasilkan "foo"

Berbeza dengan xstr(foo), str(foo) menghasilkan "foo" kerana:

  • Praproses: Tiada rentetan token hadir.
  • Penggantian Hujah: Tiada yang berkenaan.
  • Penggantian Parameter: #foo kekal tidak berubah kerana foo belum digantikan dengan 4.
  • Mengimbas semula: #foo tidak diimbas semula, menghasilkan "foo".

Oleh itu, penggunaan makro pembantu seperti xstr memastikan pengembangan teks (langkah 2) dilakukan sebelum rentetan (langkah 1), membenarkan penukaran rentetan yang betul .

Atas ialah kandungan terperinci Mengapakah `xstr(foo)` Output '4' Manakala `str(foo)` Output 'foo' dalam Pengembangan Makro seperti C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn