Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Namakan kekeliruan dan extern "C" dalam C++

Namakan kekeliruan dan extern "C" dalam C++

WBOY
WBOYke hadapan
2023-08-29 10:21:111297semak imbas

名称混淆和extern "C"在C++中

Dalam C++ kita boleh menggunakan ciri overloading fungsi. Menggunakan ciri ini, kita boleh mencipta fungsi dengan nama yang sama. Satu-satunya perbezaan ialah jenis parameter dan bilangan parameter. Jenis pemulangan tidak dipertimbangkan di sini. Persoalannya sekarang ialah, bagaimana C++ membezakan antara fungsi terlampau beban dalam kod sasaran?

Dalam kod sasaran, ia menukar nama dengan menambah maklumat tentang parameter. Teknik yang digunakan di sini dipanggil nama mangling. C++ tidak mempunyai teknik penggumpalan nama piawai. Oleh itu penyusun yang berbeza menggunakan teknik yang berbeza.

Di bawah adalah contoh nama mangling. Fungsi terlebih beban dinamakan func(), dan terdapat satu lagi fungsi my_function(). . tukar . Kod C++ berikut akan menghasilkan ralat.

Contoh

int func(int x) {
   return x*x;
}
double func(double x) {
   return x*x;
}
void my_function(void) {
   int x = func(2); //integer
   double y = func(2.58); //double
}

Output

int __func_i(int x) {
   return x*x;
}
double __func_d(double x) {
   return x*x;
}
void __my_function_v(void) {
   int x = __func_i(2); //integer
   double y = __func_d(2.58); //double
}

Masalah berlaku kerana pengkompil menukar nama printf(). Dan ia tidak menemui definisi fungsi printf() yang dikemas kini. Untuk menyelesaikan masalah ini kita perlu menggunakan extern "C" dalam C++. Apabila beberapa kod digunakan dalam blok ini, pengkompil C++ memastikan bahawa nama fungsi tidak rosak. Jadi nama tidak akan berubah. Jadi kod di atas akan kelihatan seperti ini untuk menyelesaikan masalah ini.

Contoh

int printf(const char *format,...);
main() {
   printf("Hello World");
}

Output

undefined reference to `printf(char const*, ...)'
ld returned 1 exit status

Nota:

Blok kod ini mungkin menghasilkan hasil yang berbeza dalam penyusun yang berbeza.

Atas ialah kandungan terperinci Namakan kekeliruan dan extern "C" dalam C++. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:tutorialspoint.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam