Rumah >pembangunan bahagian belakang >C++ >Mengapa Stringifikasi dalam Makro C/C Menghasilkan Keputusan Yang Tidak Dijangka Apabila Bersarang?

Mengapa Stringifikasi dalam Makro C/C Menghasilkan Keputusan Yang Tidak Dijangka Apabila Bersarang?

DDD
DDDasal
2024-12-17 11:03:25655semak imbas

Why Does Stringification in C/C   Macros Produce Unexpected Results When Nested?

Stringifikasi: Memahami Proses

Apabila berurusan dengan makro dalam bahasa pengaturcaraan seperti C dan C , konsep stringifikasi boleh menjadi menarik. Stringifikasi menukar hujah makro kepada literal rentetan. Artikel ini meneroka cara rentetan berfungsi, terutamanya memfokuskan pada senario biasa yang menghasilkan output yang tidak dijangka.

Dalam C, contohnya, rentetan biasanya dilakukan menggunakan operator #, seperti dalam:

#define str(s) #s

Pertimbangkan definisi makro berikut:

#define foo 4

Menggunakan makro str on foo akan menghasilkan "foo" dan bukannya "4". Ini kerana proses pengembangan makro dalam C melibatkan berbilang langkah:

  1. Pemprosesan prapemproses: Arahan prapemproses seperti #define diproses terlebih dahulu.
  2. Stringification : Makro seperti str() digunakan, menukar hujahnya kepada rentetan.
  3. Penggantian token: Token seperti foo digantikan dengan nilai yang ditentukan.

Dalam kes str(foo), rentetan berlaku dalam langkah 2 , menukar foo kepada "foo". Langkah 3 kemudian menggantikan "foo" dengan nilai yang ditentukan 4, menghasilkan output "4".

Walau bagaimanapun, apabila str() digunakan sebagai hujah kepada makro lain, seperti:

#define xstr(s) str(s)

Tingkah laku yang tidak dijangka boleh berlaku. Menggunakan xstr(foo) akan mengeluarkan "4" dan bukannya "foo".

Untuk memahami sebab ini berlaku, kita perlu mempertimbangkan langkah-langkah yang terlibat dalam pengembangan xstr():

  1. Stringifikasi: Tiada # atau ## token hadir, jadi tiada tindakan diambil.
  2. Penggantian hujah: foo digantikan dengan 4.
  3. Penggantian parameter: s dalam str() digantikan dengan 4, menghasilkan str(4).
  4. Imbas semula: str(4) diimbas semula (menghasilkan output "4").

Dalam xstr(foo), langkah 2 menggantikan hujah foo dengan 4 dan hanya maka langkah 1 digunakan untuk menukar hasil bertali str(4) kepada "4".

Ini menunjukkan kepentingan memahami proses pengembangan makro dan susunan langkah yang berbeza dilaksanakan. Dengan menggunakan makro pembantu yang melakukan langkah tertentu terlebih dahulu, pembangun boleh mengawal hasil rentetan dan mencapai gelagat yang diingini.

Atas ialah kandungan terperinci Mengapa Stringifikasi dalam Makro C/C Menghasilkan Keputusan Yang Tidak Dijangka Apabila Bersarang?. 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