2010-03-20 61 views
5

Tôi đã đi qua các mã sau đây, và là một người mới bắt đầu C, tôi đến đây để được giúp đỡ của bạn.Khai báo một hàm bên trong một hàm?

Chức năng này là từ một c implmentation của một hàng đợi.

Bool queuePut(Queue *q, char c) 
{ 
    void beep(); 

    if (queueFull(q)) 
    { 
     beep(); 
     return false; 
    } 

    //do stuff 

    return true; 
} 

Vì vậy, tôi gặp lỗi lạ với gcc trên khoảng trống bíp(). Ai đó có thể vui lòng giải thích cho tôi những gì được điều này, tuyên bố một chức năng bên trong một chức năng. Hoặc là nó beep void() chỉ đơn giản là ra khỏi vị trí? Tôi đã được cung cấp mã này và luôn có khả năng nó không chính xác.

Edit: Các lỗi Tôi nhận:

c:/djgpp/tmp/src/ccrjtmBh.o:queue.c:(.text+0x50): undefined reference to 
    '_beep' 
collect 2: ld returned 1 exit status. 

Đây có phải là một lỗi liên kết?

+0

Lỗi gì? ___ – kennytm

+1

Có, đó là lỗi liên kết. Bạn không chỉ phải khai báo mỗi hàm mà bạn sử dụng - bạn cũng phải định nghĩa tất cả chúng, hoặc liên kết với các thư viện để xác định các hàm. Vì các thư viện của bạn không định nghĩa 'beep()', bạn phải làm như vậy. –

+1

Và, như một quy tắc chung, các hàm cần được khai báo trong các tiêu đề và các tiêu đề được sử dụng; tuyên bố một chức năng bên trong một chức năng khác như thế là một công thức cho các vấn đề bảo trì sau này. –

Trả lời

4

lẽ Hầu hết các bạn đang gặp một lỗi khi liên kết vì:

void beep(); 

là một nguyên mẫu của một hàm mà đã được xác định ở nơi khác. Trong C bạn không thể xác định một hàm bên trong một hàm khác. Xin vui lòng, xây dựng trên các lỗi bạn đang nhận được.

+0

Tôi đã xác định một hàm trong một hàm khác trước đây. Cuối cùng tôi phải di chuyển nó ra ngoài vì những lý do khác, nhưng có thể, ít nhất là với gcc. –

+1

@Ignacio OK, nhưng đó là phần mở rộng GCC^_ ^ – AraK

3

Điều này bất thường nhưng hợp pháp. Lỗi bạn đang thấy có thể là từ trình liên kết, nếu không có beep() được xác định thực tế ở bất kỳ nơi nào khác. Bạn có thể đăng lỗi thực tế mà bạn nhận được không?

1

Như những người khác đã lưu ý những gì đang xảy ra ở đây là chức năng của bạn đang khai báo một mẫu thử nghiệm cho một hàm có tên "bíp". Cách để làm việc xung quanh điều này là để đảm bảo rằng tiếng bíp chức năng được bao gồm trong biên dịch hoặc liên kết của bạn.

Bước đầu tiên là để đảm bảo bạn đang biên soạn tất cả các tập tin mà bạn nhận được và liên kết tất cả các lib hỗ trợ của

Nếu điều này không làm việc bạn chỉ có thể thêm các phương pháp cho mình;)

void beep() { 
    printf ("beep\n"); 
} 
Các vấn đề liên quan