Câu hỏi này xuất phát từ kết quả của một số chương trình ngôn ngữ hỗn hợp. Tôi đã có một thói quen Fortran tôi muốn gọi từ mã C++. Fortran vượt qua tất cả các thông số của nó bằng cách tham chiếu (trừ khi bạn nói nó khác).Trình biên dịch C++ thực sự chuyển tham số tham chiếu như thế nào?
Vì vậy, tôi nghĩ rằng tôi muốn được thông minh (khởi đầu tồi tệ ngay tại đó) trong C của tôi ++ mã và xác định một cái gì đó thường xuyên Fortran như thế này:
extern "C" void FORTRAN_ROUTINE (unsigned & flag);
Mã này đã làm việc trong một thời gian nhưng (tất nhiên đúng khi Tôi cần phải rời đi) đột nhiên bắt đầu thổi vào một cuộc gọi trở lại. Dấu hiệu rõ ràng của một ngăn xếp cuộc gọi.
kỹ sư khác đến phía sau tôi và cố định các vấn đề, tuyên bố rằng thói quen có được định nghĩa trong C++ như
extern "C" void FORTRAN_ROUTINE (unsigned * flag);
tôi muốn chấp nhận rằng ngoại trừ hai điều. Một là nó có vẻ khá trực quan đối với trình biên dịch để không vượt qua các tham số tham chiếu bằng cách tham chiếu và tôi không thể tìm thấy tài liệu nào ở bất kỳ đâu nói điều đó. Cách khác là anh ta đã thay đổi toàn bộ các mã khác trong cùng một lúc, vì vậy về mặt lý thuyết có thể là một thay đổi khác đã khắc phục được vấn đề.
Vì vậy, câu hỏi là, C++ thực sự vượt qua tham số tham chiếu như thế nào? Có thể tự do sao chép, sao chép cho các giá trị nhỏ hay gì đó không? Nói cách khác, các thông số tham chiếu hoàn toàn vô dụng trong lập trình ngôn ngữ hỗn hợp không? Tôi muốn biết vì vậy tôi không làm cho cùng một sai lầm mã giết chết bao giờ trở lại.
tham chiếu và con trỏ là điều tương tự khi bạn vượt qua giai đoạn xác thực: http://stackoverflow.com/questions/1640355/whats-the-low-level-difference-between-a-pointer-an-a- tham khảo –
@CrazyJugglerDrummer: Từ những gì tôi đọc ở đó, câu trả lời thực sự là "không cần thiết, nhưng với hầu hết các trình biên dịch ngày nay có". Tôi muốn đi xa như vậy để nói rằng đó là cùng một câu hỏi như tôi, ngoại trừ việc tôi thêm vào các nếp nhăn của việc có thói quen trong câu hỏi được định nghĩa là 'extern" C "'. Điều đó có lẽ kỳ diệu làm cho họ giống nhau không? –