2012-02-23 9 views
5

sau đây test.c chương trìnhTại sao GCC không nhất quán về việc phát ra cảnh báo cho các chức năng không khai báo?

int main() { 
    dummySum(1, 2); 
    return 0; 
} 

int dummySum(int a, int b) { 
    return a + b; 
} 

... không tạo ra bất kỳ cảnh báo khi biên soạn với gcc -o test test.c, trong khi những sản phẩm sau một trong những hiện:

int main() { 
    dummySum(1, 2); 
    return 0; 
} 

void dummySum(int a, int b) { 
    a + b; 
} 

Tại sao?

+0

Không. Tôi cũng nghĩ vậy. 'int' vs' void' kiểu trả về 'dummySum'. – mattjgalloway

+1

Kiểu trả về mặc định của hàm undeclared là int. Khi bạn khai báo nó là void, nó không tìm thấy bất kỳ hàm nào phù hợp. Tôi tin rằng nếu bạn sử dụng kiểm tra cảnh báo mạnh hơn (ví dụ: -Wall), bạn sẽ nhận được cảnh báo trong cả hai trường hợp. – Joe

+1

trong bài đăng đầu tiên nó giống nhau, bạn nói đúng. tôi đã chỉnh sửa bài đăng. Xin lỗi –

Trả lời

8

Khi đối mặt với một chức năng chưa được khai báo, trình biên dịch giả định một chức năng chấp nhận số lượng nhất định các đối số (tôi nghĩ) và trả int(một phần tôi chắc chắn rằng các). Cái thứ hai của bạn không, và vì vậy bạn nhận được cảnh báo định nghĩa lại.

Tôi tin rằng, dựa trên quá trình quét nhanh chóng của bảng điều khiển, C99 (PDF link) đã xóa mục này. Không có bất ngờ lớn mà GCC vẫn cho phép họ (với một cảnh báo), mặc dù; Tôi không thể tưởng tượng bao nhiêu mã sẽ bắt đầu thất bại trong việc biên dịch ...


Đề nghị sử dụng -Wall (bật tất cả các cảnh báo) để bạn có được một số lượng lớn thông tin bổ sung (bạn có thể tắt cảnh báo cụ thể khi bạn có lý do thực sự tốt cho bất kỳ điều gì bạn đang làm để tạo ra chúng nếu cần).

+0

'int tiềm ẩn' đã bị xóa trong C99, vì vậy ở chế độ C99 nghiêm ngặt hoặc chế độ C11, nó không được biên dịch, IMO. Tuy nhiên, gcc biên dịch nó và chỉ phun ra một cảnh báo (cho cả hai). –

+0

@DanielFischer: Thú vị! Trên thực tế, tôi chỉ nhìn vào C99 và tôi nghĩ rằng nó đi xa hơn thế: Nó loại bỏ hoàn toàn các khai báo hàm ngầm. (Điều thú vị là, từ đầu liệt kê hai mục riêng biệt, "đã loại bỏ ngầm' int' "và" khai báo hàm bị ẩn "). Tôi nghi ngờ "inticit' int' "bit đề cập đến một hàm được khai báo, nhưng không có bất kỳ kiểu trả về nào cả. –

+0

Có lẽ, không phải là một luật sư ngôn ngữ, tôi có xu hướng sử dụng 'int ngầm' cho tất cả các tình huống mà một loại được giả định vì nó không được khai báo. –

2

Không thể sử dụng chức năng trước khi nó được khai báo. Khi khai báo hàm là không nhìn thấy được, việc thực hiện giả định trong C89 rằng chức năng:

  • mất một số lượng không xác định (nhưng cố định) các thông số

  • trả về một int

này được gọi là khai báo hàm tiềm ẩn.

Trong C99, khai báo ngầm về chức năng đã bị xóa khỏi ngôn ngữ và việc triển khai miễn phí từ chối dịch mã nguồn.