Ngôn ngữ liên kết C ++ khác với C?


25

Ngôn ngữ C ++ cho phép kết hợp cả C ++ và C trong một tệp nguồn. Ví dụ,

extern "C" {
    struct bar { /* ... */ }
}

C ++ hay đã từng hỗ trợ bất kỳ "ngôn ngữ liên kết" nào khác ngoài C chưa? ví dụ extern "Pascal"hoặcextern "Haskell"


hầu hết thời gian cả hai ngôn ngữ sẽ extern "C"tương đương với nhau để tương tác với nhau
quái vật ratchet

C ++ hỗ trợ liên kết khác bằng cách cho phép imlementations thêm các loại liên kết của họ (§7.5), câu hỏi cần được "Đỗ triển khai tồn tại hoặc có tồn tại implementtions" ;-)
Johannes

2
extern "C"chỉ ảnh hưởng đến liên kết, không ảnh hưởng đến cú pháp và ngữ nghĩa của văn bản bên trong khối. Nói cách khác, nó vẫn là C ++ bên trong extern "C"khối đó ; tên biểu tượng không bị xáo trộn. Xem stackoverflow.com/q/1041866/712605
Richard Hansen

Câu trả lời:


17

extern "C" có thể là yêu cầu duy nhất:

Mọi triển khai sẽ cung cấp liên kết đến các chức năng được viết bằng ngôn ngữ lập trình C, "C" và liên kết đến các chức năng C ++, "C ++".

Tuy nhiên những người khác có thể tồn tại theo trích dẫn này:

Các chuỗi ký tự chỉ ra các liên kết ngôn ngữ cần thiết. Tiêu chuẩn quốc tế này quy định ngữ nghĩa cho chuỗi ký tự "C" và "C ++". Việc sử dụng một chuỗi ký tự khác với "C" hoặc "C ++" được hỗ trợ theo điều kiện, với ngữ nghĩa được xác định theo triển khai. [Lưu ý: Do đó, một đặc tả liên kết với một chuỗi ký tự không xác định được khi triển khai yêu cầu chẩn đoán. - lưu ý cuối] [Lưu ý: Nên đánh vần chính tả của chuỗi ký tự từ tài liệu xác định ngôn ngữ đó. Ví dụ: Ada (không phải ADA) và Fortran hoặc FORTRAN, tùy thuộc vào loại cổ điển. - lưu ý cuối]


1
Điều này được trích dẫn từ đâu?
paul

@paul c ++ 11 bản nháp tiêu chuẩn
aaronman

9

Trong nhiều (hầu hết) môi trường "extern" C "là quy ước liên kết mặc định cho bất kỳ ngôn ngữ nào trên hệ thống.

Vì vậy, tùy thuộc vào hệ điều hành và việc triển khai "ngoại ngữ" "extern C" là tất cả những gì bạn cần để gọi một chương trình bằng ngôn ngữ được biên dịch khác.


Ngay cả các môi trường không sử dụng liên kết C (Pascal tức là thường sử dụng thứ tự đối số khác trên ngăn xếp và callee phải giải phóng giá trị) chúng có chế độ tương thích C
johannes

@johannes: Trên thực tế Windows sử dụng quy ước Pascal cho nhiều thứ, nhưng vì nó cũng cần trong C và C không có extern "Language"cú pháp "", nên họ thực hiện thông qua tiện ích mở rộng C dành riêng cho nền tảng, vì vậy, đối với C ++, nó vẫn chỉ extern "C"và đặc biệt từ khóa chỉ định quy ước gọi khác nhau.
Jan Hudec

1
Vẫn có thể có trường hợp một nhà cung cấp trình biên dịch thêm các loại liên kết đặc biệt. Bên cạnh khả năng tương tác với các ngôn ngữ khác, điều này cũng có thể thú vị với khả năng tương tác với việc xáo trộn tên C ++ khác nhau. Câu hỏi là liệu có ai làm không :)
johannes


-4
  • Không! C ++ chỉ hỗ trợ C là "ngôn ngữ liên kết".

  • bên ngoài "C" {thanh cấu trúc {/ * ... * /}}

  • Cú pháp như trên có nghĩa là không thay đổi tên của biến, struct hoặc hàm. Bởi vì C ++ có thể thay đổi tên của biến, struct hoặc hàm để thực hiện nạp chồng Class, Namespace và hàm.

  • Nếu bạn không làm điều này, trình liên kết có thể không thể tìm ra đối tượng của biến, cấu trúc của hàm.

  • C ++ được thiết kế để tương thích với C. "C" bên ngoài là cách để thực hiện tương thích với C.


10
Vui lòng kiểm tra §7,5 của tiêu chuẩn C ++. extern "C"extern "C++"là những người bắt buộc duy nhất, nhưng việc triển khai được phép cung cấp cho người khác.
johannes
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.