-D_XOPEN_SOURCE làm / nghĩa là gì?


103

Gần đây tôi đã gặp một số mã mà gcc sẽ không biên dịch nếu không có lập luận này. Tôi đã kiểm tra trang gcc man, nhưng không tìm thấy tùy chọn cụ thể này. Tôi đã tìm thấy XOPEN_SOURCE, nhưng có rất ít lời giải thích về những gì nó làm.

Ai đó có thể vui lòng giải thích? Tôi biết -D_XOPEN_SOURCEcó thể được thiết lập để giá trị khác nhau, chẳng hạn 400, 600nhưng những gì làm những việc phải làm?

Câu trả lời:


132

Khi bạn làm

#define _XOPEN_SOURCE <some number>

hoặc là

cc -D_XOPEN_SOURCE=<some number>

nó yêu cầu trình biên dịch của bạn bao gồm các định nghĩa cho một số chức năng bổ sung được xác định trong các tiêu chuẩn X / Open và POSIX.

Điều này sẽ cung cấp cho bạn một số chức năng bổ sung tồn tại trên hầu hết các hệ thống UNIX / BSD / Linux mới đây, nhưng có thể không tồn tại trên các hệ thống khác như Windows.

Các con số đề cập đến các phiên bản khác nhau của tiêu chuẩn.

Bạn có thể biết mình cần cái nào (nếu có) bằng cách xem trang người dùng cho từng chức năng bạn gọi.

Ví dụ, man strdupnói:

   Feature Test Macro Requirements for glibc (see feature_test_macros(7)):

       strdup(): _SVID_SOURCE || _BSD_SOURCE || _XOPEN_SOURCE >= 500
       strndup(), strdupa(), strndupa(): _GNU_SOURCE

Có nghĩa là bạn nên đặt một trong những điều sau:

#define _SVID_SOURCE
#define _BSD_SOURCE
#define _XOPEN_SOURCE 500
#define _XOPEN_SOURCE 600
#define _XOPEN_SOURCE 700

ở đầu tệp nguồn của bạn trước khi thực hiện bất kỳ thao tác nào #includenếu bạn muốn sử dụng strdup.

Hoặc bạn có thể đặt

#define _GNU_SOURCE

thay vào đó, nó cho phép tất cả các chức năng, với nhược điểm là nó có thể không biên dịch trên Solaris, FreeBSD, Mac OS X, v.v.

Đó là một ý tưởng tốt để kiểm tra từng trang người đàn ông trước khi làm một #include, #definehoặc sử dụng một chức năng mới, bởi vì đôi khi hành vi của họ thay đổi tùy thuộc vào những tùy chọn và #definelà bạn có, ví dụ với basename (3) .

Xem thêm:


4
Chỉ một nhận xét để nhấn mạnh mức độ quan trọng của "ở đầu tệp nguồn của bạn" đối với các định nghĩa ngôn ngữ-phương ngữ này. Nếu chúng không ở trên cùng, chúng không hoạt động.
Dr. Person Person II

6

-Dlà tùy chọn trình biên dịch ac để xác định một biến tiền xử lý. Trong trường hợp này _XOPEN_SOURCE.

Điều này không thực sự ảnh hưởng đến hành vi của chính trình biên dịch, nhưng thay đổi cách một số thư viện, ví dụ như thư viện c chuẩn, hoạt động. Có một số tùy chọn như thế này. Trong hầu hết các trường hợp, chúng liên quan đến một số tài liệu tiêu chuẩn về một số giao diện lập trình cụ thể của UNIX hoặc một số nhà cung cấp thư viện cụ thể.

Việc xác định một trong số chúng đôi khi là cần thiết, bởi vì hoạt động của một số chức năng tiêu chuẩn hoặc thậm chí chữ ký của chúng có thể khác nhau giữa các tiêu chuẩn. Vì vậy, bạn có thể phải sử dụng -D_XOPEN_SOURCEhoặc thứ gì đó tương tự để bật chế độ tương thích.

Một cách sử dụng khác có thể có của các cờ này là đảm bảo mã nguồn của bạn nằm trong giới hạn của một tiêu chuẩn nhất định, bằng cách chuyển các tiện ích mở rộng do triển khai thư viện C của bạn cung cấp. Đây là một trong những biện pháp bạn có thể sử dụng để đảm bảo rằng mã của bạn chạy trên nhiều nền tảng nhất có thể.


3

Điều này cho thấy tiêu đề thuộc về định nghĩa của một quy chuẩn nhất định, chẳng hạn như posix. Định mức thực tế mà nó thuộc về được xác định bằng giá trị (ví dụ ở đây là 400 hoặc 600). Xem Tài liệu tham khảo này để biết ràng buộc định mức / giá trị.


1

Vì một số lý do không xác định, Mac OS / X (XCode) yêu cầu 600 để xác định strdup (), mặc dù nó nằm trong đặc tả năm 1995. Mozilla và những người khác đã gặp phải vấn đề này ...

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.