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 strdup
nó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 #include
nế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
, #define
hoặ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à #define
là bạn có, ví dụ với basename (3) .
Xem thêm: