Computer >> Máy Tính >  >> Lập trình >> lập trình C

Đặt tên Mangling và extern “C” trong C ++

Trong C ++, chúng ta có thể sử dụng tính năng nạp chồng hàm. Sử dụng tính năng này, chúng ta có thể tạo các hàm có cùng tên. Sự khác biệt duy nhất là loại đối số và số lượng đối số. Loại trả lại không được xem xét ở đây. Bây giờ câu hỏi đặt ra là làm thế nào C ++ phân biệt các hàm được nạp chồng trong mã đối tượng?

Trong mã đối tượng, nó thay đổi tên bằng cách thêm thông tin về các đối số. Kỹ thuật được áp dụng ở đây được gọi là Name Mangling. C ++ không có kỹ thuật chuẩn hóa cho việc quản lý tên. Vì vậy, các trình biên dịch khác nhau sử dụng các kỹ thuật khác nhau.

Đây là một ví dụ về Name Mangling. Các hàm được nạp chồng được đặt tên là func () và một hàm khác my_ functions () ở đó.

Ví dụ

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
}

Một số trình biên dịch C ++ sẽ thay đổi nó như dưới đây -

Ví dụ

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
}

C không hỗ trợ nạp chồng hàm, Vì vậy, chúng ta phải đảm bảo rằng tên của một biểu tượng không bị thay đổi, khi chúng ta liên kết một mã C trong C ++. Mã C ++ sau sẽ tạo ra lỗi.

Ví dụ

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

Đầu ra

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

Sự cố này đang tạo ra do tên của printf () được trình biên dịch thay đổi. Và nó không tìm thấy định nghĩa của hàm printf () được cập nhật. Để khắc phục vấn đề này, chúng ta phải sử dụng "C" bên ngoài trong C ++. Khi một số mã được sử dụng bên trong khối này, thì trình biên dịch C ++ đảm bảo rằng tên hàm không bị nhầm lẫn. Vì vậy, tên sẽ không được thay đổi. Vì vậy, đoạn mã trên sẽ như thế này để giải quyết vấn đề này.

Ví dụ

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

Đầu ra

Hello World

Lưu ý: Các khối mã này có thể tạo ra các kết quả khác nhau trong các trình biên dịch khác nhau.