2012-03-02 26 views
5

thể trùng lặp:
Error: No previous prototype for function. Why am I getting this error?Không có nguyên mẫu trước?

Tôi có một chức năng mà tôi prototyped trong file header, tuy nhiên Xcode vẫn mang lại cho tôi cảnh báo No previous prototype for the function 'printBind'. Tôi có chức năng setBind prototyped theo cùng một cách nhưng tôi không nhận được một cảnh báo cho chức năng này trong việc thực hiện của tôi.

CelGL.h

#ifndef Under_Siege_CelGL_h 
#define Under_Siege_CelGL_h 

void setBind(int input); 
void printBind(); 

#endif 

CelGL.c

#include <stdio.h> 
#include "CelGL.h" 

int bind; 

void setBind(int bindin) { // No warning here? 
    bind = bindin; 
} 

void printBind() { // Warning here 
    printf("%i", bind); 
} 

Trả lời

19

Trong C, điều này:

void printBind(); 

không phải là một nguyên mẫu. Nó khai báo một hàm trả về không có gì (void) nhưng có một danh sách các đối số không xác định. (Tuy nhiên, đó danh sách các đối số không phải là biến; tất cả các chức năng tham gia một danh sách đối số chiều dài biến phải có một nguyên mẫu đầy đủ trong phạm vi để tránh những hành vi không xác định.)

void printBind(void); 

Đó là một nguyên mẫu cho hàm mà mất không lập luận.

Các quy tắc trong C++ khác nhau - lần đầu tiên khai báo hàm không có đối số và tương đương với đối số thứ hai.

Lý do cho sự khác biệt là lịch sử (đọc 'ngày trở lại giữa thập niên 1980'). Khi các nguyên mẫu được đưa vào C (một vài năm sau khi chúng được thêm vào C++), có một số lượng lớn mã đã khai báo hàm không có danh sách đối số (vì đó không phải là một tùy chọn trước khi nguyên mẫu được thêm vào). rằng SomeType *SomeFunction(); phải tiếp tục có nghĩa là 'một hàm trả về một số SomeType * nhưng chúng ta không biết gì về danh sách đối số'. C++ cuối cùng đã thêm ký hiệu SomeType *SomeFunction(void); để tương thích với C, nhưng không cần nó vì liên kết kiểu an toàn đã được thêm vào sớm và tất cả các hàm cần một mẫu thử nghiệm trong phạm vi trước khi chúng được xác định hoặc sử dụng.

+0

Mặc dù giờ đây tôi đã hiểu lý do lỗi, nhưng tôi thực sự không hiểu tính hữu ích của tính năng này. Khi nào bạn định nghĩa một hàm với một danh sách tham số không xác định và chính xác điều này sẽ làm gì với C++? Đây có phải là một tính năng hữu ích trong C++ không? – sherrellbc

+0

Bạn không thể xác định nguyên mẫu có danh sách đối số không xác định trong C++. Trong C++, điều đó có nghĩa là "không có đối số", không phải "đối số không xác định". Tính năng này không hữu ích nhiều như là một sự nhượng bộ cần thiết cho thực tế. Khi C được chuẩn hóa, toàn bộ cơ sở mã lớn được viết mà không có nguyên mẫu; họ đã không tồn tại trong C. Ký hiệu ngoặc đơn trống là tất cả đã có trong chuẩn trước C. Để có outlawed nó sẽ giết chết các tiêu chuẩn C non trẻ. Điều đó vẫn đúng với C99. Nó không rõ ràng cho C11, nhưng không thay đổi. –

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