2012-03-12 19 views
5

giáo sư của tôi đã cho chúng tôi mã này:Vấn đề với hàm C này có chứa hàm là gì?

timerX(int x){ 

    int times(int y){ 
      return x * y; 
    } 
    return times; 

} 

Làm thế nào để làm việc này trong C (sử dụng trình biên dịch GCC)? Ông nói rằng ngay sau khi chức năng biến mất chức năng bên trong biến mất? Tôi đánh giá cao bất kỳ lời khuyên hay lời khuyên nào.

+2

Xem http://en.wikipedia.org/wiki/Trampoline_%28computing%29 –

+0

Cảm ơn Basile - Tôi đang nghiên cứu! – Coffee

+2

vui lòng đăng mã hợp lệ. Một nỗ lực để làm như vậy có thể đã mang lại cho bạn một số thông tin chi tiết. Đặc biệt nó sẽ rất thú vị nếu xem 'timerX' thực sự có' int (*) (int) 'như là một giá trị trả về. –

Trả lời

7

Nó được gọi là nested function, a GNU extension. Về cơ bản

  • chức năng bên trong có thể acess các biến cục bộ của hàm ngoài (những tuyên bố trước cuộc hiện ra của nó)

  • chức năng bên trong chỉ có thể được gọi từ bên ngoài thông qua poinyers chức năng nhưng không sau khi hàm chứa đã kết thúc nếu hàm bên trong truy cập các đối tượng từ cha mẹ của nó

Trong ví dụ của bạn, hãy gọi con trỏ hàm đó từ bên ngoài có thể sẽ là bất hợp pháp.

Nếu bạn cố gắng để gọi hàm lồng nhau thông qua địa chỉ của nó sau khi hàm chứa đã thoát, tất cả địa ngục sẽ phá vỡ lỏng lẻo.

+0

Cảm ơn bạn rất nhiều và tôi đang nghiên cứu liên kết bạn đã cung cấp! – Coffee

3

Tôi chắc chắn nó hoạt động giống như bất kỳ chức năng nào khác, ngoại trừ việc nó chỉ hiển thị với chức năng kèm theo.

Nói cách khác, nó chỉ liên quan đến khả năng hiển thị hoặc khả năng truy cập của hàm và không có gì khác.

Các vấn đề liên quan