2008-09-30 20 views

Trả lời

1

-pedantic-lỗi

+3

+1 Điều này sẽ biến biên soạn thành niềm vui. ;) – unexist

+2

@unexist Thử cài đặt 'clang' (trình biên dịch C của dự án LLVM) và sau đó biên dịch với' -Weverything' và bạn sẽ thấy cách biên dịch thú vị thực sự có thể trở thành (một số cảnh báo hoàn toàn điên rồ, nhưng chúng về mặt kỹ thuật là chính xác). – Mecki

2

tôi thường biên dịch với "-W Wall -ansi -pedantic" này giúp đảm bảo chất lượng tối đa và tính di động của mã này.

+3

chỉ cần ghi chú -ansi ghi đè -std = c99 – Sard

+1

Không phải là -ansi tương đương với việc sử dụng -std = c89? – helpermethod

15

Tôi thích -Werror. Giữ cảnh báo mã miễn phí.

+20

Nếu không có -Werror tất cả các tùy chọn cảnh báo khác là vô nghĩa. Điều trị cảnh báo là lỗi là cách duy nhất để đảm bảo cảnh báo được giải quyết. Nếu họ chỉ là cảnh báo, một nhà phát triển có thể quyết định để lại một trong vì anh ta chắc chắn nó không hợp lệ. Nó thậm chí có thể đúng, nhưng nhà phát triển tiếp theo sẽ không sửa chữa những cảnh báo anh ta giới thiệu bởi vì anh ta không thấy nó giữa tất cả những người khác, hoặc bởi vì nó chỉ là một cảnh báo nữa. –

+0

Hoàn toàn chính xác của bạn. – JesperE

+5

Tôi không đồng ý với Kristof, bởi vì nhiều lần, tôi chỉ muốn có một bản sao làm việc được biên dịch đầu tiên và _then_ địa chỉ các lỗi. – Yktula

5

tôi cũng sử dụng:

-Wstrict tràn = 5

Để bắt những lỗi khó chịu rằng thể xảy ra nếu tôi viết code dựa trên hành vi tràn số nguyên.

Và:

-Wextra

nào cho phép một số tùy chọn mà là tốt đẹp để có là tốt. Hầu hết là cho C + + mặc dù.

+4

-Wextra có vẻ là tên mới cho -W (Mà vẫn còn được hỗ trợ) – Sard

45

Tôi thường xuyên sử dụng:

gcc -m64 -std=c99 -pedantic -Wall -Wshadow -Wpointer-arith -Wcast-qual \ 
     -Wstrict-prototypes -Wmissing-prototypes 

bộ này bắt rất nhiều cho những người không sử dụng đến nó (người mà mã lệnh của tôi nhận được biên dịch với những lá cờ lần đầu tiên); nó hiếm khi mang lại cho tôi một vấn đề (mặc dù -Wcast-qual đôi khi là một phiền toái).

+0

Những ngày này, tôi tìm thấy tôi phải thêm ''-Wdeclaration-after-statement'' để phát hiện mã mà MSVC (mà về cơ bản vẫn là trình biên dịch C89) sẽ không xử lý được. 'Thật phiền toái. Thêm ''-Wextra'' có thể phát hiện một số vấn đề khác nữa. –

+2

Ngoài ra, bạn nên thêm '-O3' hoặc một cái gì đó tương tự; có những cảnh báo chỉ được tạo khi mã được tối ưu hóa. –

+3

theo gcc doc, -O2 là cách tốt nhất để phát hiện cảnh báo. Tôi không chắc chắn nếu -O3 ngụ ý -O2 hoặc cho phép nhiều cảnh báo được tạo ra. – Offirmo

2

-pedantic Wall -Wextra -Wno-ghi-chuỗi -Wno-không sử dụng tham số

Đối với chế độ "Hurt tôi rất nhiều", tôi rời đi những -Wno ...

Tôi thích có cảnh báo mã của tôi miễn phí, đặc biệt là với C++. Trong khi cảnh báo trình biên dịch C thường có thể bị bỏ qua, nhiều cảnh báo C + + hiển thị các lỗi cơ bản trong mã nguồn.

+2

Tại sao -Wno-write-strings? – Tom

+2

Bởi vì chuỗi công cụ là tự do để đưa các chuỗi ký tự vào bộ nhớ chỉ đọc. – DevSolar

+3

Tại sao thông số -Wno-unused-? Rất hiếm khi nó trỏ đến các vấn đề thực sự (và "rất hiếm khi" là mối nguy hiểm chính xác với việc vô hiệu hóa nó: các lỗi không thể giải quyết là điều tồi tệ nhất để phát hiện). Ví dụ: nếu có thể kích hoạt trên 'Foo (int dndu, int dndv): dndu_ (dndu), dndv_ (dndu) {}' -> tương đối khó phát hiện. Nếu bạn bực mình vì cảnh báo đó, bạn chỉ cần bỏ qua tham số 'foo (int/* q * /)', điều này cũng làm tăng khả năng đọc mã của bạn. –

1

-Wfloat-bình đẳng, -Wshadow, -Wmissing-nguyên mẫu,

1

-Wredundant-decls -Wnested-externs -Wstrict-nguyên mẫu -Wextra -Werror-ngầm-Hàm-khai -Wunused -Wno-unused- giá trị -Wreturn kiểu

14

tôi bắt đầu với C++, vì vậy khi tôi đã chuyển sang học CI làm chắc chắn sẽ thêm-hậu môn:

 
-fmessage-length=0 
-ansi -pedantic -std=c99 
-Werror 
-Wall 
-Wextra 
-Wwrite-strings 
-Winit-self 
-Wcast-align 
-Wcast-qual 
-Wpointer-arith 
-Wstrict-aliasing 
-Wformat=2 
-Wmissing-declarations 
-Wmissing-include-dirs 
-Wno-unused-parameter 
-Wuninitialized 
-Wold-style-definition 
-Wstrict-prototypes 
-Wmissing-prototypes 
+3

Bạn có thể sử dụng -ansi -pedantic -std = c99 cùng một lúc không? Không phải là -ansi gần giống như c89? và nếu như vậy làm thế nào mà làm việc với cờ c99? – Johan

+2

@Johan - bạn có thể, và nó không thực sự cần thiết, như tôi đã phát hiện ra gần đây hơn. -ansi ngụ ý -std = , vì vậy thực sự bạn chỉ có thể nói -std = c99 -pedantic và nhận được chính xác tác dụng tương tự. Tôi có xu hướng sử dụng nó dù sao, chỉ cho hiệu ứng tài liệu. Tôi cảm thấy nó đọc, "Mã này là ANSI-standard (pedantic!), Sử dụng chuẩn C99". Ngay lập tức sau đó thường đến -Wno-dài dài hoặc tương tự ... bất kỳ trường hợp ngoại lệ với tiêu chuẩn ANSI. – Tom

1

Ngay bây giờ tôi sử dụng:

Wall -W-Chúng tôi Xtra -Wconversion -Wshadow -Wcast-qual -Wwrite-strings -Werror

tôi lấy danh sách đó chủ yếu là từ cuốn sách "Giới thiệu về gcc" và sau đó một số từ Ulrich Drepper recomendation về Lập trình phòng thủ (http://people.redhat.com/drepper/Defensive-slides.pdf).

Nhưng tôi không có bất kỳ khoa học nào trong danh sách của mình, nó chỉ cảm thấy giống như một danh sách tốt.

/Johan


Lưu ý: Tôi không thích những lá cờ pedantic dù ....

Lưu ý: Tôi nghĩ rằng -W và -Wextra ít nhiều điều tương tự.

+2

Afer sử dụng -Wconversion, và chi tiêu một vài giờ kiểm tra các loại dữ liệu khác nhau trong mã của tôi và tái xây dựng, tôi nghiên cứu -Wconversion và sẽ không khuyên bạn nên sử dụng nó nói chung. Vấn đề là nó tạo ra các cảnh báo về mã như: char a = 5; char b = a - 1; Điều này đang sử dụng gcc 4.3.2 (Debian 4.3.2.-1.1) –

+0

Cảnh báo chuyển đổi có thể được loại bỏ bởi (ví dụ như ở trên bình luận): char a = 5; char b = (char) (a - 1); dấu ngoặc đơn. –

0

-Wfatal-errors

1

tôi thì thường hay dùng

gcc -Wall -W -Wunused-parameter -Wmissing-declarations -Wstrict-prototypes -Wmissing-prototypes -Wsign-compare -Wconversion -Wshadow -Wcast-align -Wparentheses -Wsequence-point -Wdeclaration-after-statement -Wundef -Wpointer-arith -Wnested-externs -Wredundant-decls -Werror -Wdisabled-optimization -pedantic -funit-at-a-time -o 
1

Cảnh báo về biến chưa được khởi tạo không hoạt động trừ khi bạn chỉ định -O, vì vậy tôi bao gồm trong danh sách của tôi:

-g -O -Wall -Werror -Wextra -pedantic -std=c99 
9

Nhận hướng dẫn sử dụng cho phiên bản GCC bạn sử dụng, tìm tất cả các tùy chọn cảnh báo có sẵn, và sau đó hủy kích hoạt chỉ những thứ mà bạn có lý do hấp dẫn để làm như vậy. (Ví dụ: các tiêu đề của bên thứ ba không thể sửa đổi sẽ cung cấp cho bạn nhiều cảnh báo khác.) Ghi lại các lý do đó. (Trong Makefile hoặc bất cứ nơi nào bạn đặt các tùy chọn đó.) Xem lại các cài đặt tại các giao diện thông thường, và bất cứ khi nào bạn nâng cấp trình biên dịch của mình.

Trình biên dịch là bạn của bạn. Cảnh báo là bạn của bạn. Cung cấp cho trình biên dịch càng nhiều cơ hội để cho bạn biết các vấn đề tiềm ẩn nhất có thể.

+1

FYI, hướng dẫn không cung cấp một danh sách toàn diện các cảnh báo. Tuy nhiên, bạn có thể tìm thấy danh sách như vậy [ở đây] (https://github.com/barro/compiler-warnings), cùng với các công cụ được sử dụng để tạo ra chúng. –

32

Tính đến 2011/09/01, với gcc phiên bản 4.6.1

hiện tại của tôi "phát triển" bí danh

 
gcc -std=c89 -pedantic -Wall \ 
    -Wno-missing-braces -Wextra -Wno-missing-field-initializers -Wformat=2 \ 
    -Wswitch-default -Wswitch-enum -Wcast-align -Wpointer-arith \ 
    -Wbad-function-cast -Wstrict-overflow=5 -Wstrict-prototypes -Winline \ 
    -Wundef -Wnested-externs -Wcast-qual -Wshadow -Wunreachable-code \ 
    -Wlogical-op -Wfloat-equal -Wstrict-aliasing=2 -Wredundant-decls \ 
    -Wold-style-definition -Werror \ 
    -ggdb3 \ 
    -O0 \ 
    -fno-omit-frame-pointer -ffloat-store -fno-common -fstrict-aliasing \ 
    -lm 

Các "giải phóng" bí danh

 
gcc -std=c89 -pedantic -O3 -DNDEBUG -flto -lm 

Kể từ năm 2009-11-03

"d evelopment" bí danh

 
gcc -Wall -Wextra -Wformat=2 -Wswitch-default -Wcast-align -Wpointer-arith \ 
    -Wbad-function-cast -Wstrict-prototypes -Winline -Wundef -Wnested-externs \ 
    -Wcast-qual -Wshadow -Wwrite-strings -Wconversion -Wunreachable-code \ 
    -Wstrict-aliasing=2 -ffloat-store -fno-common -fstrict-aliasing \ 
    -lm -std=c89 -pedantic -O0 -ggdb3 -pg --coverage 

'phát hành' bí danh

 
gcc -lm -std=c89 -pedantic -O3 -DNDEBUG --combine -fwhole-program -funroll-loops 
+1

'-Wfloat-equal' được thêm vào bí danh của tôi. Cảm ơn bạn Mark – pmg

+2

Lưu ý rằng '-Queanh-aliasing = 2' thực sự làm giảm mức cảnh báo' -Wstrict-aliasing = 3' được ngụ ý bởi '-Wall', ít nhất là với phiên bản gcc gần đây. – nwellnhof

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