2013-01-31 36 views
8

Một số ví dụ tôi chạy vào cho một chương trình liên quan đến menu ..Tại sao lại khai báo một hàm trong chính?

Ông đã khai báo tất cả hàm trước hàm chính như tôi hiểu, và sau đó một hàm là hàm trống cũng được đề cập bên trong chính:

char get_choice(void); 
char get_first(void); 
int get_int(void); 
void count(void); 
int main(void) 
{ 
    int choice; 
    void count(void); 
    while ((choice = get_choice()) != 'q') 
    { 
     switch (choice) 
     { 
      case 'a' : printf("Buy low, sell high.\n"); 
       break; 
      case 'b' : putchar('\a'); /* ANSI */ 
       break; 
      case 'c' : count(); 
       break; 
      default : printf("Program error!\n"); 
       break; 
     } 
    } 
    printf("Bye.\n"); 

... (chức năng triển khai)

bạn có thể vui lòng cho tôi biết tại sao lại thế? tnx

+0

cảm ơn chỉnh sửa @djechlin – MNY

Trả lời

4

Đây chỉ là khai báo các hàm không định nghĩa.Không quá chắc chắn tại sao hàm đếm được khai báo hai lần mặc dù. Việc khai báo chỉ là nói với trình biên dịch là có gì đó có tên này. Có lẽ lập trình viên quên xác định phương thức ?

Tuyên bố cung cấp các thuộc tính cơ bản của một biểu tượng: loại và tên của nó. Một định nghĩa cung cấp tất cả các chi tiết của biểu tượng đó - nếu đó là một hàm, nó là gì; nếu đó là một lớp, những lĩnh vực và phương pháp nào nó có; nếu đó là một biến, nơi mà biến đó được lưu trữ.

ví dụ như lời tuyên bố như sau:

void count(void); 

ví dụ như định nghĩa như sau:

void count(void){ 

...... 

} 
6

Không có lý do gì cả, đây chỉ là sự lặp lại vô nghĩa của nguyên mẫu.

+0

Cảm ơn allot @unwind – MNY

3

Không quan trọng - bất cứ nơi nào hợp lý cho chương trình của bạn. Rõ ràng, nếu nó nằm bên trong chính, thì không có hàm nào khác trước khi thực hiện hàm thực tế sẽ "biết" nguyên mẫu hàm là gì, có thể có tác động gì.

Cá nhân tôi có xu hướng triển khai hàm trước khi nó được gọi, theo cách đó tránh được vấn đề nơi đặt mẫu thử [trừ khi nó đi trong một tệp headerfile, trong trường hợp đó có xu hướng giải quyết vấn đề].

+0

cảm ơn một loạt @ MatsPetersson – MNY

1

bạn có thể vui lòng cho tôi biết tại sao lại thế? tnx

Không có lý do tại sao ngoài việc đó là một sai lầm đơn giản; tác giả chỉ đơn giản là bỏ lỡ tuyên bố thừa. Vì vậy, miễn là cả hai khai báo là như nhau, nó không phải là một vấn đề (mặc dù nó xấu xí và nên được làm sạch).

FWIW, đây là lý do tại sao tôi luôn luôn xác định các chức năng trước khi chúng được sử dụng trong cùng một tệp. Định nghĩa được tính là một tuyên bố, vì vậy chỉ có một nguyên mẫu để lo lắng.

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