2010-06-11 11 views
6

Tại sao vẫn còn C99 mixed declarations and code không được sử dụng trong các dự án C nguồn mở như Linux kernel hoặc GNOME?C99 tuyên bố hỗn hợp và mã trong các dự án mã nguồn mở?

Tôi thực sự thích các khai báo và mã hỗn hợp vì nó làm cho mã dễ đọc hơn và ngăn khó xem các lỗi bằng cách hạn chế phạm vi của các biến thành mức hẹp nhất có thể. Điều này được Google for C++ đề xuất.

Ví dụ, Linux requires ít nhất GCC 3.2 và GCC 3.1 has support cho C99 tờ khai hỗn hợp và mã

+6

Tôi thực sự * không thích * các khai báo hỗn hợp vì chúng làm cho mã ít đọc và gây khó khăn hơn để xem lỗi. –

+1

Justin, tôi không thể không đồng ý nhiều hơn với chỉnh sửa của bạn. Tôi * ghét * nhìn thấy một tiêu đề (phông chữ lớn, đậm) có thể áp dụng cho nhiều ngôn ngữ và phải tìm một nơi khác trên màn hình cho các thẻ được viết bằng phông chữ nhỏ, tương phản để biết tôi có gì không để nói về câu hỏi. Tiêu đề mơ hồ được định hướng chỉ bởi các thẻ là một cơn ác mộng khả năng sử dụng. Và về chủ đề khả năng sử dụng, các thẻ thường thêm thông tin, thay vì di chuyển nó. –

+4

@Carl, @Eduardo Tôi nghĩ rằng bạn vừa phóng đại những lỗi có thể gây ra bởi phong cách ưa thích của người khác. Các biến chức năng phạm vi dẫn đến sự thối mã khi mã được loại bỏ và các biến trở nên không được sử dụng, trong khi khối phạm vi có thể dẫn đến biến đổi bóng nếu không cẩn thận về cách đặt tên. Cả hai vấn đề đều bị bắt bởi một cảnh báo trình biên dịch tốt, nhưng phạm vi hẹp vẫn vượt trội vì nó giúp dễ dàng tìm ra các mẫu sử dụng dữ liệu daft ... do đó dẫn đến mã tốt hơn, dễ hiểu hơn. –

Trả lời

3

Đây là câu hỏi cũ nhưng tôi sẽ đề nghị quán tính là lý do mà hầu hết các dự án này vẫn sử dụng quy tắc khai báo ANSI C.

Tuy nhiên có một số khả năng khác, từ hợp lệ để lố bịch:

  • Khả năng di chuyển. Nhiều dự án mã nguồn mở hoạt động theo giả định rằng ANSI C là cách di động nhất để viết phần mềm.

  • Tuổi. Nhiều dự án trong số này có trước thông số C99 và các tác giả có thể thích một kiểu mã hóa nhất quán.

  • Sự thiếu hiểu biết. Các lập trình viên gửi trước C99 và không biết về lợi ích của các khai báo và mã hỗn hợp. (Giải thích thay thế: Nhà phát triển hoàn toàn nhận thức được sự cân bằng tiềm năng và quyết định rằng các tuyên bố và tuyên bố hỗn hợp không đáng để nỗ lực. Tôi rất không đồng ý, nhưng hiếm khi hai lập trình viên đồng ý về bất cứ điều gì.)

  • FUD. Các lập trình viên xem các khai báo hỗn hợp và mã như một "C++ ism" và không thích nó vì lý do đó.

0

Có lẽ nó không cần thiết, có thể tách là tốt? Tôi làm điều đó trong C++, trong đó có tính năng này là tốt.

1

Có rất ít lý do để viết lại hạt nhân Linux để thực hiện các thay đổi về mỹ phẩm không mang lại hiệu quả.

Nếu cơ sở mã đang hoạt động, vậy tại sao thay đổi nó vì lý do thẩm mỹ?

+1

Không cần phải viết lại bất cứ điều gì. Nhưng có thể thu hẹp phạm vi biến đổi trong mã mới nên được khuyến nghị. – Eduardo

+0

Có điều gì đó để nói về sự nhất quán trên cơ sở mã. – Alan

+1

Đó là sau khi tất cả các hobgoblin của tâm trí nhỏ (một sự nhất quán ngu ngốc, đó là). Và tâm trí không ai nhỏ hơn khi họ đang xem xét các tiêu chuẩn mã hóa ;-) –

3

Bạn không cần khai báo và mã hỗn hợp để giới hạn phạm vi. Bạn có thể làm:

{ 
    int c; 
    c = 1; 
    { 
    int d = c + 1; 
    } 
} 

trong C89. Đối với lý do tại sao các dự án này đã không sử dụng khai báo hỗn hợp (giả định điều này là đúng), nó rất có thể là một trường hợp "Nếu nó không bị phá vỡ không sửa chữa nó."

0

Không có lý do gì để thay đổi mã như thế này và C99 vẫn không được hỗ trợ rộng rãi bởi trình biên dịch. Đó là chủ yếu là về tính di động.

+3

"C99 vẫn chưa được hỗ trợ rộng rãi bởi các trình biên dịch" - đây có phải là mối quan tâm trong hạt nhân Linux không? Ví dụ: linux + gcc có được khởi động bằng trình biên dịch C89 cho một số nền tảng không? –

+0

Có thể không phải cho hạt nhân Linux, vì nó là khá gắn với GCC và lắp ráp của nó, nhưng đối với nhiều dự án đó là một yêu cầu. Linux chỉ là quá lớn để tái cấu trúc tất cả các mã để nó như thế này vì lý do vô dụng. – alternative

1

Tôi không nhớ bất kỳ sự can thiệp nào đối với điều này trong hướng dẫn kiểu cho mã hạt nhân. Tuy nhiên, nó nói rằng các chức năng nên càng nhỏ càng tốt, và chỉ làm một việc. Điều này sẽ giải thích tại sao một hỗn hợp của các tờ khai và mã là hiếm.

Trong một chức năng nhỏ, khai báo các biến ở đầu phạm vi hoạt động như một loại Introit, cho bạn biết điều gì đó sắp diễn ra sau đó. Trong trường hợp này, chuyển động của khai báo biến rất hạn chế đến mức nó có khả năng không có hiệu lực, hoặc phục vụ để che giấu một số thông tin về chức năng bằng cách đẩy barker vào đám đông, để nói. Có một lý do là sự xuất hiện của một vị vua được tuyên bố là trước khi ông vào một căn phòng.

OTOH, một hàm phải trộn các biến và mã có thể đọc được có thể quá lớn. Đây là một trong các dấu hiệu (cùng với các khối quá lồng nhau, các bình luận nội dòng và các thứ khác) rằng một số phần của hàm cần được tóm tắt thành các hàm riêng biệt (và được khai báo là static, vì vậy trình tối ưu hóa có thể nội tuyến chúng).

Một lý do khác để giữ các khai báo ở đầu các hàm: nếu bạn cần sắp xếp lại việc thực hiện các câu lệnh trong mã, bạn có thể di chuyển một biến ra khỏi phạm vi của nó mà không nhận ra nó, vì phạm vi của một biến được khai báo trong giữa mã không phải là hiển nhiên trong thụt đầu dòng (trừ khi bạn sử dụng một khối để hiển thị phạm vi). Điều này là dễ dàng cố định, do đó, nó chỉ là một khó chịu, nhưng mã mới thường trải qua loại chuyển đổi, và khó chịu có thể được tích lũy.

Và một lý do khác: bạn có thể bị cám dỗ để khai báo một biến để lấy mã lỗi lại từ một chức năng, như vậy:

void_func(); 
int ret = func_may_fail(); 
if (ret) { handle_fail(ret) } 

điều hoàn toàn hợp lý để làm. Nhưng:

void_func(); 
int ret = func_may_fail(); 
if (ret) { handle_fail(ret) } 
.... 
int ret = another_func_may_fail(); 
if (ret) { handle_other_fail(ret); } 

Rất tiếc! ret được xác định hai lần. "Vậy, bỏ tờ khai thứ hai đi." bạn nói. Nhưng điều này làm cho mã không đối xứng, và bạn kết thúc với nhiều hạn chế tái cấu trúc hơn.

Tất nhiên, tôi kết hợp các khai báo và tự viết mã; không có lý do để giáo điều về nó (hoặc nghiệp lực của bạn có thể chạy trên giáo điều của bạn :-). Nhưng bạn nên biết những vấn đề đồng thời là gì.

0

Không có lợi ích. Khai báo tất cả các biến ở đầu hàm (pascal like) rõ ràng hơn nhiều, trong C89 bạn cũng có thể khai báo các biến ở đầu mỗi phạm vi (ví dụ vòng lặp bên trong) vừa thực tế vừa súc tích.