2009-03-12 53 views
12

thể trùng lặp:
What parameter parser libraries are there for C++?Trình phân tích cú pháp tùy chọn cho C/C++?

tôi đã thực hiện một số tìm kiếm và có rất nhiều toàn bộ thư viện cho dòng lệnh tùy chọn phân tích cú pháp, nhưng rất khó để phân biệt giữa chúng. Có ai có bất kỳ kinh nghiệm với bất kỳ người trong số họ? Là một trong những khó khăn hơn/tốt hơn/nhanh hơn/dễ dàng hơn/bất cứ điều gì hơn bất kỳ những người khác? Hay tôi nên tự trồng?

+3

Bỏ phiếu bầu cho "cuộn của riêng bạn". a) Bạn học từ nó, b) thật thú vị, và c) bạn sẽ không phải lo lắng về tính di động hoặc tùy thuộc vào mã của người khác, và d) bạn biết bạn sẽ có tất cả các tính năng bạn muốn, và không có những người bạn không. Tuy nhiên, tôi nghĩ rằng tôi sẽ là thiểu số. –

+9

@ Chris Lutz: trừ khi bạn cuộn của riêng bạn để nó tuân thủ rất chặt chẽ với tiêu chuẩn, sau đó bạn có nguy cơ sản xuất các chương trình gây khó chịu để sử dụng. Việc sử dụng trình phân tích cú pháp tùy chọn tiêu chuẩn sẽ làm giảm việc học cho mọi người khác (những người sử dụng chương trình của bạn) và thường đơn giản hóa việc bảo trì. –

+2

Tôi vừa mới triển khai https://github.com/visionmedia/commander.ca port-ish của trình phân tích cú pháp tùy chọn ruby ​​và nút của tôi –

Trả lời

1

nếu bạn đang sử dụng linux/unix thì getopt là trình phân tích cú pháp tùy chọn cho bạn. hoạt động trên hầu như tất cả các hương vị của unix và rất dễ sử dụng

13

Đối với nhiều mục đích, các chức năng GNU getopt()getopt_long() là những lựa chọn tốt.

GNU getopt() dành cho các đối số tùy chọn một chữ cái và hews khá gần với hành vi tiêu chuẩn POSIX và có thể được thuyết phục để hoạt động chính xác hơn bằng cách đặt biến môi trường POSIXLY_CORRECT. Sự khác biệt là GNU getopt() nhận ra các đối số tùy chọn sau đối số phi tùy chọn đầu tiên và cho phép các đối số để tất cả các đối số tùy chọn được xử lý trước bất kỳ đối số không tùy chọn nào. Điều này đôi khi quan trọng - mặc dù các bối cảnh có xu hướng có một chút bí truyền. Có một vài thủ thuật phụ khác có sẵn.

GNU getopt_long() là cơ chế tốt nhất để xử lý các tùy chọn dài như --help. Nó có thể xử lý các đối số tùy chọn, phù hợp với các tùy chọn một chữ cái và tất cả các loại thứ.

Có rất nhiều gói khác có sẵn để xử lý các tùy chọn theo nhiều cách khác nhau.

(Perl có một loạt các module getopt, phản ánh bao nhiêu nỗ lực đã được đưa vào trong những năm qua.)

Bạn có thể tìm thấy một số thông tin bổ sung hữu ích tại What is the general syntax of a Unix shell command. Bạn cũng có thể đọc đặc tả POSIX cho các quy ước dòng lệnh trong chương Utility Conventions.

+0

Chỉ có một điều xấu về GNU getopt() và nó là giấy phép. – Anonymous

+1

Có - ít nhất là LGPL trong những ngày này. Nó từng là GPL đầy đủ. Bạn có thể nhận các phiên bản getopt() không phải GNU. Ví dụ, AT & T đã xuất bản nguồn trên UseNet. –

+2

Một đặc điểm kỹ thuật tốt về cách thức các tiện ích POSIX được thiết kế để hoạt động được đưa ra trong chương trình POSIX [Utility Conventions] (http://www.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html). –

18

Nếu bạn muốn một cái gì đó hoàn toàn đa nền tảng, tôi đã tìm thấy thư viện Boost::Program_Options là rất tốt. Có một cái gì đó của một đường cong học tập để thiết lập nó, nhưng một khi bạn nắm vững điều đó, nó đơn giản hóa mọi thứ rất nhiều.

+0

Điều xấu về thư viện này là nó không phải là "chỉ tiêu đề", trái ngược với hầu hết các thành phần khác của Boost. Tôi chưa bao giờ thực sự hiểu tại sao lại như vậy. – becko

+0

Chỉ vì nhà phát triển chọn làm theo cách đó. Tôi đã trở nên kém mê hoặc hơn vì tôi đã viết nó. Nó tốt, và đa nền tảng, nhưng tôi thấy rằng tôi thích tùy chọn xử lý với mã của riêng tôi hầu hết thời gian. Thời gian tôi viết một trình phân tích cú pháp tùy chọn từ đầu thường thấp hơn chi phí để tìm ra cách thiết lập mã thư viện để làm điều tương tự, nhất là khi tôi không cần xử lý các tệp cấu hình, chỉ các tùy chọn dòng lệnh. –

+1

Thực tế là Boost :: Program_Options không phải là tiêu đề chỉ là một vấn đề, bởi vì Boost cập nhật phiên bản thường xuyên. Điều này có nghĩa rằng nếu bạn không liên kết tĩnh với Boost :: Program_Options, chương trình của bạn sẽ không chạy trong tất cả các máy với phiên bản Boost sai! – becko

1

Tôi sử dụng triển khai hệ thống getopt_long() cho hầu hết mọi thứ, tuy nhiên bạn có thể cần phải di chuyển nhiều hơn, ngăn cấm việc sử dụng các tiện nghi sinh vật POSIX như vậy.

Here is the standard về chế độ xem POSIX của các tùy chọn dòng lệnh nếu bạn ở vị trí mà getopt()/getopt_long() không khả dụng và cần phải cuộn của riêng bạn. Bạn cũng có thể muốn xem những gì POSIX nói về các hiển thị tóm tắt trợ giúp/tùy chọn (Tôi không thể tìm thấy một liên kết đến phần đó của tay tắt chuẩn).

Cá nhân, tôi không thích sử dụng các chương trình không mất thời gian - tùy chọn dài, vì việc ghi nhớ các tùy chọn ngắn là một nỗi đau và không có hai chương trình nào sử dụng giống nhau.

6

boost::program_options là khá tốt và có giao diện C++ đẹp có thể kiểm tra thông số tùy chọn có một loại nhất định (như 'int') và lưu chúng trực tiếp vào biến.

Nó cũng hỗ trợ tải "tùy chọn" từ tệp cấu hình, vì vậy bạn sẽ nhận được trình phân tích cú pháp tệp cấu hình miễn phí. Bằng cách này bạn có thể dễ dàng cho phép ghi đè lên tất cả các thiết lập cấu hình từ dòng lệnh hoặc thêm tất cả các tùy chọn dòng lệnh vào tập tin cấu hình, điều này làm cho nó rất linh hoạt.

2

cũng có popt.

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