Vâng, có một trick bạn đang thiếu: bạn có thể sử dụng -std=gnu99
thay vì -std=c99
.
-std=c99
#define
s __STRICT_ANSI__
, mà /usr/include/features.h
giải thích là "không cho phép bất cứ điều gì ngoài chuẩn C theo mặc định" (không có nó, bạn sẽ có được ít nhất cả _SVID_SOURCE
và _BSD_SOURCE
). Mặt khác, -std=gnu99
có nghĩa là "C99 cộng với phần mở rộng GNU" (mặc định gcc hiện tại là -std=gnu89
, tương đương C89 của nó, đó là lý do tại sao bạn cần chỉ định thứ gì đó để có được các tính năng C99 mới).
Thay vào đó, bạn có thể bật các macro thử nghiệm tính năng (như được đề cập trong câu trả lời của @ litb). Nhìn vào số /usr/include/stdlib.h
trong hệ thống của tôi, nó trông đợi một trong số __USE_SVID
, __USE_XOPEN_EXTENDED
hoặc __USE_BSD
. /usr/include/features.h
nói với tôi rằng các macro thử nghiệm tính năng mà sẽ cho phép này là:
_SVID_SOURCE
(cho phép __USE_SVID
)
_BSD_SOURCE
(cho phép __USE_BSD
)
_XOPEN_SOURCE
với một giá trị tối thiểu là 500
(cho phép __USE_XOPEN_EXTENDED
)
_XOPEN_SOURCE_EXTENDED
(cũng cho phép __USE_XOPEN_EXTENDED
)
_GNU_SOURCE
(Cho phép tất cả mọi thứ, bao gồm bốn tính năng macro kiểm tra ở trên)
Đối với chương trình mới, nơi bạn không phải quá lo lắng về xung đột tên tiềm năng với các chức năng mới từ các tiêu chuẩn trong tương lai, sử dụng cả hai -std=gnu99
và -D_GNU_SOURCE
là một ý tưởng tốt.Nó cho phép bạn sử dụng tất cả các tính năng tiêu chuẩn mới và phần mở rộng GNU, kết hợp với một số loại dự phòng (ví dụ, các bài kiểm tra tính năng kiểu autoconf
) mang lại sự linh hoạt nhất.
Tài liệu tham khảo:
tôi phải xuống bỏ phiếu phản ứng này kể từ đúng tiêu đề của được đưa (cả stdlib và toán học). Bí quyết đã được xác định vĩ mô. Cảm ơn vì sự trả lời! – SetJmp
Tôi không thấy bạn đã đề cập đến toán học.h – dirkgently
Như một tổng số C noob, tôi đánh giá cao việc đề cập đến 'srand' ít nhất. Cảm ơn! – jocull