2012-03-11 59 views
6

Cho đến nay, tôi biết hai phong cách:..Có bao nhiêu kiểu hàm viết trong C?

/* 1st style */ 
int foo(int a) { 
return a; 
} 

/* 2nd style */ 
int foo(a) 
int a; 
{ 
return a; 
} 

(tôi nhìn thấy một người nào đó viết mã theo phong cách thứ 2 tôi đã rất ngạc nhiên lúc đầu nhưng phong cách thứ 2 làm việc (dưới gcc như tôi thử nghiệm) Điều này khiến tôi tò mò và tôi muốn đặt câu hỏi này.)

Trả lời

0

Cách thứ hai là K & Cú pháp kiểu RC, nhưng nó đã lỗi thời. Thanh toán @Basile Starynkevitch của câu trả lời.

+0

Và iirc này đã được tán thành trong phiên bản của tôi về "Ngôn ngữ lập trình C, Ấn bản thứ hai, ANSI C" từ năm 1990. –

+0

ya nó đã lỗi thời, bổ sung nó. – phoxis

0

Kiểu thứ hai là kiểu cũ hơn và được hỗ trợ để tương thích ngược. Tôi không biết bất kỳ phong cách nào khác ngoài đầu của tôi, nhưng bạn nên sử dụng phong cách đầu tiên (mới hơn). Phong cách thứ hai (cũ hơn) đã không còn được dùng nữa khi tôi bắt đầu làm việc với C (1994).

12

Tôi sẽ không gọi những kiểu này, nhưng các biến thể ngôn ngữ (hoặc phương ngữ).

Kiểu mã hóa là tập hợp các quy ước tùy chọn có thể không được theo sau. Ví dụ, một số kiểu mã yêu cầu tên macro là tất cả các thủ đô (nhưng mã của bạn sẽ biên dịch nếu bạn không tuân theo quy tắc đó).

của bạn "2 nd phong cách" được gọi là Kernighan & Ritchie C. Nó là C cũ được định nghĩa vào cuối những năm 1970 (trong ấn bản đầu tiên của một cuốn sách nổi tiếng trên C bởi Kernighan và Ritchie; các ấn bản tiếp theo phù hợp với các tiêu chuẩn C sau này). Đó là một ngôn ngữ lỗi thời.

Trình biên dịch hiện tại thường tuân theo tiêu chuẩn ISO C99 ISO (xuất bản năm 1999), đã được thay thế bằng tiêu chuẩn C11 mới (xuất bản năm 2011).

Trình biên dịch GCC đang chấp nhận tiêu chuẩn C99 với đối số chương trình -std=c99. Tôi đề xuất biên dịch với gcc -Wall -std=c99; Các trình biên dịch GCC gần đây (ví dụ 4.6 và 4.7) đang chấp nhận -std=c11 IIRC cho tiêu chuẩn mới hơn C11.

Không mã hôm nay bằng phương ngữ Kernighan và Ritchie C cũ: nó đã lỗi thời và ít được hỗ trợ bởi trình biên dịch. IMHO C99 là một tiêu chuẩn tốt để theo dõi nếu bạn thận trọng. Và tận dụng lợi thế của một số tính năng của nó (đặc biệt, khả năng trộn các khai báo và các câu lệnh bên trong một khối; các phương thức cũ hơn C để đặt tất cả các khai báo ở đầu khối.).

Tiêu chuẩn đã được tiến hành, đặc biệt bởi vì nó đã thêm các tính năng và chính xác hơn là w.r.t. với các hệ thống hiện hành và thông lệ (ví dụ như bộ vi xử lý đa lõi)

+2

Bạn sẽ gây nhầm lẫn cho mọi người bằng cách gọi một ngôn ngữ và không sử dụng K & R C khi bạn nhận xét chỉ dựa trên một dòng mã. – Rob

+0

+1, nhưng: phong cách cũ là từ những năm 70, phong cách mới được định nghĩa vào năm 1989; trình biên dịch MSVC vẫn không theo C99. –

2

Có (ít nhất) hai nhược điểm khi sử dụng phong cách thứ 2:

  1. Nếu prototype hàm cũng là mất tích, trình biên dịch sẽ không kiểm tra cho loại đối số thích hợp . Và, nếu tôi nhớ chính xác, số đối số đối số cũng sẽ không được chọn.
  2. Kiểu này (K & R, 1st Ed) chỉ có hiệu lực cho tương thích ngược ... một ngày nào đó, tiêu chuẩn C sẽ (có thể) không cho phép kiểu này và chương trình của bạn sẽ dừng lại.

Ngoài ra, để có thể đọc tốt hơn, bạn có thể đặt kiểu trả về chức năng của trên một dòng riêng (đặc biệt hữu ích với các loại dài dòng trở lại như unsigned long int và tiêu đề):

int 
foo(int a) 
{ 
    return a; 
} 
+0

Bạn cũng làm điều này để làm cho việc trích xuất tài liệu tự động bằng các tập lệnh perl và awk dễ dàng hơn. –

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