Có nên sử dụng cờ -pedantic trong g ++ hay không?


16

Tôi đang học C ++ và tôi đang sử dụng g ++ trên Linux để thực hành.

  1. Tôi muốn biết nếu những người làm lập trình viên sử dụng cờ g ++ -pedantic và tầm quan trọng của nó trong thế giới thực.

  2. Những gì về trình biên dịch khác, họ cũng cho phép điều này? Điều này đã trở thành một số tiêu chuẩn thực tế?

Tôi quan tâm bởi vì tôi đang đọc C ++ Primer trong đó tác giả chỉ ra rằng việc sử dụng biểu thức không phải là hằng trong định nghĩa mảng và g ++ theo mặc định cho phép nó là bất hợp pháp. Và có thể có những thứ khác tôi không biết.



Câu trả lời:


21

Vâng, hoàn toàn làm điều này. Trong thực tế, bạn cần nghiên cứu trang hướng dẫn và bật nhiều cảnh báo hơn -pedantic-Wallsẽ làm.

Không, không có tiêu chuẩn. MSVC sử dụng /W4ví dụ.


7
+1, tôi thường làm -Wall -Wextra -Werror -pedantic -std=c++0x:)
greyfade

4
@JaredBurrows: Trên thực tế tôi đã ngừng sử dụng -pedanticvới C ++ vì hướng dẫn của GCC ngụ ý nó chỉ dành cho C và tôi đã chuyển sang sử dụng -std=c++14trong các dự án mới.
greyfade

1
@greyfade À, đáng lẽ tôi phải nói, -Wall -Wextra -Werror -std=c++14:)
Jared Burrows

1
Tôi mới phát hiện ra lỗi -pedantic-đưa ra lỗi không cảnh báo.
Galik

6
@VillasV Vâng -Werrorbiến tất cả các cảnh báo thành lỗi. Nhưng -pedantic-errorschỉ làm cho lỗi ra khỏi Standard ICO C++vi phạm.
Galik

10

Mặc dù tôi đã không lập trình C ++ trong một thời gian dài, tôi khuyên bạn nên sử dụng cờ này. Nó giúp bạn tạo mã tuân thủ tiêu chuẩn và sẽ giúp cuộc sống của mọi người dễ dàng hơn. AFAIK, hầu hết các trình biên dịch khác không hỗ trợ các phần mở rộng gcc / g ++.

Tôi ghét nó chẳng hạn, khi tôi không thể biên dịch mã chỉ vì nhà phát triển ban đầu quyết định viết mã theo các phần mở rộng trình biên dịch không chuẩn.

Tôi cá rằng một số lượng lớn (giả sử 20%) các chương trình linux được viết bằng C / C ++ sẽ không được biên dịch với bất cứ thứ gì ngoài gcc / g ++, khiến tôi hơi buồn. Luôn tuân thủ các tiêu chuẩn.


2
Lần cuối cùng tôi thử sử dụng các trình biên dịch khác, tôi muốn nói rằng nó giống như 20% sẽ hoạt động với các trình biên dịch khác và 80% phụ thuộc vào các phần mở rộng gcc.
Jerry Coffin

6

Cá nhân tôi sử dụng:

-Wall -Wextra -Wshadow-Weffc ++ -Wstrict-aliasing -ansi -pedantic -Werror

Do đó, bật một loạt các cảnh báo, nhưng quan trọng hơn là coi tất cả các cảnh báo là lỗi (vì hầu hết các cảnh báo là lỗi logic trong suy nghĩ của bạn).


Bạn sẽ thêm bất cứ điều gì vào danh sách này vào năm 2019?
Ayxan

1
@Ayxan Đó là bộ tối thiểu mà tôi khuyên mọi người nên sử dụng. Nhưng có một loạt nhiều hữu ích. Nhưng bạn cần phải xem lại tài liệu và xem chúng có hữu ích cho bạn không. Hãy nhìn vào-Wunreachable-code -Wno-long-long
Martin York

1
@Ayxan Khi xây dựng mã hồ sơ:-g -pg -fprofile-arcs -ftest-coverage
Martin York

1
@Ayxan Khi xây dựng gỡ lỗi-g -O0
Martin York

1
@Ayxan Khi xây dựng mã sản xuất-O3
Martin York

1

Nó là khá cần thiết để sử dụng -pedanticcờ.

Tôi chỉ nói thêm rằng với tiêu chuẩn hiện tại, nên sử dụng một cái gì đó tương tự như:

-std=c++17 -Wall -Wextra -Werror -Wpedantic -pedantic-errors

Ở đâu:

  • -std=c++17nói với nó để tuân thủ sửa đổi của tiêu chuẩn C ++, được xuất bản vào năm 2017, bạn có thể đọc thêm về nó ở đây .

  • -Wall nói với nó:

    Cho phép tất cả các cảnh báo về các công trình mà một số người dùng cho là đáng nghi ngờ và dễ tránh (hoặc sửa đổi để ngăn cảnh báo), thậm chí kết hợp với macro, nói cách khác là một số cảnh báo.

  • -Wextra nói với nó để kích hoạt một số cảnh báo, vẫn không phải tất cả.

  • -Werror nói với nó để làm cho tất cả các cảnh báo thành lỗi.

  • -Wpedantichoặc chỉ -pedanticnói với nó:

    Đưa ra tất cả các cảnh báo theo yêu cầu nghiêm ngặt của ISO C và ISO C ++; từ chối tất cả các chương trình sử dụng các tiện ích mở rộng bị cấm và một số chương trình khác không tuân theo ISO C và ISO C ++.

  • -pedantic-errors bảo nó đưa ra lỗi bất cứ khi nào tiêu chuẩn cơ sở (xem -Wpedantic) yêu cầu chẩn đoán.


Bộ này thường hữu ích không chỉ cho người mới bắt đầu, vì họ sẽ dần dần tìm hiểu từng cảnh báo có khả năng dẫn đến lỗi, mà còn cho sử dụng bình thường.

Tất cả các tùy chọn cảnh báo được mô tả chi tiết tại đây trên trang GNU / GCC .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.