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
Lepaskan: 2024-12-17 11:03:25
asal
654 orang telah melayarinya

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
Salin selepas log masuk

Pertimbangkan definisi makro berikut:

#define foo 4
Salin selepas log masuk

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)
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan