Hôm nay, tiếng kêu đang thay thế gcc ở hầu hết các places. tức là, hầu hết * hệ điều hành giống như NIX và bản phân phối Linux. Một số ví dụ oare FreeBSD, Minix và mac (một chút rõ ràng) clang đã chuyển clang thành trình biên dịch mặc định. Một số bạn bè của tôi cũng vậy, khi tôi cho họ xem.
IMHO này, có vẻ như một số người gặp sự cố với nó, có thể là trong các phiên bản cũ hơn. Nhưng với clang phiên bản 3.0, tôi không có bất kỳ vấn đề này. Như tôi đã biết trước đây, tôi đang sử dụng nó thực sự trong tất cả các dự án mới của mình. Hầu như trình biên dịch mặc định của tôi, đôi khi tôi làm make C=gcc
chỉ để thấy sự khác biệt về lỗi/cảnh báo clang. Và kêu vang bao giờ hết. Với giải thích tốt hơn và thực hiện một nỗ lực tuyệt vời để tối ưu hóa. Nó bao gồm các đề xuất cho các phần mở rộng sử dụng (một số là gcc inerhid) của trình biên dịch đến một hiệu quả tốt nhất trong việc tạo mã.
Tôi đã viết một chức năng tầm thường để in thông báo lỗi. Nhưng tôi sẽ thoát khỏi chương trình sau khi in thông báo lỗi trên đầu ra tiêu chuẩn.Vì vậy, tôi thực hiện một sửa đổi đơn giản, đặt exit(1)
làm tuyên bố cuối cùng trong hàm. Như sau:
void error(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
fprintf(stderr, "error: ");
vfprintf(stderr, fmt, ap);
va_end(ap);
exit(1);
}
Và như vậy chương trình kêu vang
cảnh báo: chức năng 'lỗi' có thể được khai báo với thuộc tính 'noreturn' [-Wmissing-noreturn] `
(gcc không sản xuất ngay cả khi không có -Wall -Wextra -Wunreachable-code -O3
cờ)
Tôi nói "điều đó có vẻ đẹp. Nhưng thuộc tính 'nonreturn' là gì? Tôi ' d không bao giờ nghe hoặc đọc về điều này. Tôi chuyển sang google và tìm kiếm clang could be declared with attribute 'noreturn'
(oh, vâng, tôi chỉ có thể viết clang nonreturn attribute
, nhưng hãy quên nó) và tôi tìm thấy liên kết this
với giải thích tốt về thuộc tính này và khả năng đạt được của hiệu suất mà tôi có thể nhận được.
Vì vậy, tôi chạy để thêm thuộc tính này vào nguyên mẫu hàm của tôi (tất nhiên, nếu nó là trình biên dịch gcc hoặc clang; macro sẽ thực hiện việc dò tìm lừa). Oh yeah, với tôi, bất kỳ lợi ích nhỏ nào của sự hoàn hảo (tất nhiên, mà không làm cho mã không thể đọc được) nó là một chiến thắng.
Và không kết thúc ở đây, cách đây một năm, tôi thực hiện return
trong một chức năng ở đó một cách cẩn thận là một công tắc được xử lý mặc định (như trong hàm error()
ở đây). Nhưng ngay cả như vậy, gcc clains về chức năng mà không trả lại giá trị (Tôi xin lỗi, tôi không nhớ chính xác thông báo lỗi/cảnh báo) làm thế nào nó có thể? không có câu lệnh nào sau khi chuyển đổi, nếu không có trường hợp nào phù hợp, giá trị mặc định được thực hiện và không thực sự quan trọng các câu lệnh dưới đây, nếu có. Nhưng clang nghĩ khác, giống như tôi, và đưa ra một cảnh báo về tuyên bố này, giúp tôi tạo ra mã tốt hơn.
Và đối với loại điều rất nhỏ này, tôi yêu tiếng kêu vang. (Lưu ý: Tôi xin lỗi vì tiếng anh không tốt của tôi. Tiếng Anh không phải là tiếng mẹ đẻ của tôi, nhưng mặc dù tôi đang cố gắng thể hiện tôi ở đây)
Bạn nên đợi XCode4 và sau đó bạn sẽ thấy việc sử dụng tiếng kêu sẽ tăng vọt. – ismail
Một lưu ý: CLang là sản phẩm trưởng thành cho C, tuy nhiên hỗ trợ C++ vẫn là một tiến bộ liên tục, C++ 03 là bình thường, nhưng C++ 0x bị tụt lại phía sau wrt VC++ và gcc. Nó đang được phát triển tích cực mặc dù. –
Tôi đã sử dụng chương trình C trong GCC, bởi vì, tốt, * này là * trình biên dịch, tôi đoán tôi phải nhìn bên ngoài hộp một chút, tôi thực sự thích sự biểu cảm của các trình biên dịch khiếu nại, 1 để giới thiệu trình biên dịch này. –