Sự khác nhau giữa hàm thành viên tĩnh và hàm liên kết "C" bên ngoài là gì? Ví dụ, khi sử dụng "makecontext" trong C++, tôi cần chuyển một con trỏ tới hàm. Google khuyên bạn nên sử dụng liên kết "C" bên ngoài cho nó, bởi vì "makecontext" là C. Nhưng tôi phát hiện ra rằng sử dụng các công trình tĩnh là tốt. Tôi chỉ may mắn hay ...static vs extern "C"/"C++"
class X {
public:
static void proxy(int i) {}
}
makecontext(..., (void (*)(void)) X::proxy, ...);
vs
extern "C" void proxy(int i) {}
makecontext(..., (void (*)(void)) proxy, ...);
EDIT: Bạn có thể hiển thị một trình biên dịch hoặc kiến trúc nơi phiên bản thành viên tĩnh không hoạt động (và nó không phải là một lỗi trong trình biên dịch) ?
'Tôi xin lỗi, nhưng tôi vẫn chưa thuyết phục' ... về cái gì? thực tế là tiêu chuẩn là độc đoán hơn so với hành vi thực hiện ngẫu nhiên được xác định của một số trình biên dịch? –
Đây là một bài viết cũ (8 năm trước ngày hôm nay) Quan điểm của tôi là vào thời điểm nào đó giống như IMHO nếu mọi cài đặt hiện tại khác với tiêu chuẩn thì có lẽ bạn nên đặt câu hỏi liệu đó có phải là tiêu chuẩn sai hay không. Tôi đang tìm kiếm các ví dụ về các nền tảng mà nó không hoạt động. –
Đủ công bằng.Đó là tất nhiên không phải không nghe cho C hoặc C + + tiêu chuẩn để chứa các hậu quả ngoài ý muốn mà tất cả các trình biên dịch hiện có bỏ qua. Đây là yêu thích của tôi tại thời điểm này: http://stackoverflow.com/a/42335543/2757035 Nhưng trong trường hợp này, tôi nghĩ rằng Tiêu chuẩn khá rõ ràng nói ý nghĩa của nó là gì và triển khai có thể thay đổi hành vi của họ bất kỳ lúc nào nếu có một số lợi thế. –