2010-04-30 46 views
9

Trong một số thư viện Tôi đang sử dụng (viết bằng C) Tất cả các chức năng của mìnhĐây là mã C hợp lệ nhưng không phải là mã C++ hợp lệ?

StorePGM(image, width, height, filename) 
char *image; 
int width, height; 
char *filename; 
{ 
    // something something 
} 

được định nghĩa theo cách này. Tôi chưa bao giờ thấy những định nghĩa chức năng như vậy trong cuộc đời mình. Họ dường như có giá trị để MSVC nhưng khi tôi biên dịch nó như C++ nó cung cấp cho các lỗi.

nó là gì? một số loại phiên bản cũ C?

+1

Bạn không nên tự ý biên dịch mã C thành C++. Nếu bạn cần sử dụng nó với mã C++, bạn có thể liên kết mã với nhau và báo cho mã C++ của bạn sử dụng C-linkage ('extern" C "'). – jamesdlin

+0

Tôi nhớ lần đầu tiên nhìn thấy cú pháp này, khoảng năm 1982. Tôi nghĩ đó là đầu gối của con ong! (Sau FORTRAN, rất nhiều thứ trông giống như đầu gối của ong.) – TonyK

Trả lời

16

Có. K & R, chuẩn trước C. Tránh sử dụng nó.

+2

Có, và họ cũng đề nghị không sử dụng nó trong dự án mới kể từ khi ấn bản thứ ba của cuốn sách. – tunnuz

+0

@tunnuz, Phiên bản * thứ ba *? Ấn bản thứ ba về cái gì? –

+1

@Alex - Ấn bản thứ ba của "Ngôn ngữ lập trình C" của K & R, kinh thánh cho các lập trình viên C. – QuantumPete

0

Đúng, đó là K & Kiểu R. (Kernighan & Ritchie là nhà phát minh của C) Xem thêm http://www.lysator.liu.se/c/bwk-tutor.html để biết ví dụ về phong cách tiền ANSI này.

+6

Kernighan không liên quan gì đến sáng chế của C. –

+0

Không nhận thức được thực tế đó, cảm ơn. Dù sao anh ta đồng tác giả cuốn sách đầu tiên về C ... – MartinStettner

5

Trước tiêu chuẩn ANSI C 1989, C không có nguyên mẫu (khai báo hàm xác định loại tham số); những tuyên bố và định nghĩa kiểu cũ này đều có sẵn.

Năm 1989, tiêu chuẩn ANSI C (về cơ bản đã trở thành tiêu chuẩn ISO C 1990) đã giới thiệu các nguyên mẫu. Nếu tôi nhớ chính xác, ý tưởng thực sự đến từ C++ (mà chưa được chuẩn hóa vào thời điểm đó). Các khai báo và định nghĩa kiểu cũ vẫn hợp pháp, do đó mã cũ vẫn có thể được biên dịch. Tiêu chuẩn năm 1989 cũng cho rằng các tuyên bố kiểu cũ là "lỗi thời", có nghĩa là chúng có thể được loại bỏ trong một phiên bản tương lai của tiêu chuẩn.

Tiêu chuẩn ISO C 1999, (chính thức) thay thế tiêu chuẩn năm 1990, để lại điều này một mình; các khai báo và định nghĩa kiểu cũ vẫn hợp pháp, và tất cả các trình biên dịch phù hợp đều phải hỗ trợ chúng (mặc dù chúng được tự do cảnh báo về chúng, vì chúng có thể cảnh báo về bất kỳ thứ gì khác).

Kể từ latest C201X draft (PDF lớn), vẫn còn này không thay đổi. Các khai báo và định nghĩa hàm kiểu cũ vẫn là một phần bắt buộc của ngôn ngữ và tất cả các trình biên dịch phù hợp phải hỗ trợ chúng. (Cá nhân, tôi cho rằng điều này không may.)

C++, mặt khác, chưa bao giờ (?) Hỗ trợ bất cứ điều gì ngoài nguyên mẫu như khai báo hàm; Stroustrup không quan tâm đến việc duy trì khả năng tương thích với mã C cũ.

Nhưng trừ khi bạn cần duy trì mã cũ và/hoặc sử dụng các trình biên dịch rất cũ, không có lý do chính đáng để sử dụng các khai báo hoặc định nghĩa hàm kiểu cũ.

Lưu ý rằng, ít nhất là trong C, định nghĩa này:

int main() { 
    /* ... */ 
} 

thực sự là một định nghĩa kiểu cũ. Đó là chính xác cho C++, nơi đó là một nguyên mẫu cho thấy main không có tham số, nhưng trong C nó phải được

int main(void) { 
    /* ... */ 
} 

(C++ cũng chấp nhận hình thức này để tương thích với C - nhưng do thời gian bạn đang viết main , bạn nên đã quyết định ngôn ngữ nào bạn đang sử dụng.)

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