2009-02-22 32 views
17

Tôi làm "#include <stdlib.h>" ở đầu nguồn.Tại sao gcc không thể tìm thấy giao diện ngẫu nhiên() khi -std = c99 được đặt?

Ví dụ soạn:

/usr/bin/colorgcc -std=c99 -fgnu89-inline -g -Wall -I/usr/include -I./ -I../ -I../../ -I../../../ -I../../../../ -O3 -o f8 f8.c 
In file included from f8.c:7: 
ctype-cmp.c: In function ‘randomized’: 
ctype-cmp.c:48: warning: implicit declaration of function ‘random’ 
ctype-cmp.c: In function ‘main’: 
ctype-cmp.c:153: warning: implicit declaration of function ‘srandom’ 
[email protected]:t$ 

Khi tôi tắt -std = c99, hàm isfinite() không thể được tìm thấy. Vì vậy, tôi muốn sử dụng -std = c99 vì lý do này và các lý do khác. Có một số mẹo tôi đang thiếu?

Trả lời

14

man srandom cho biết chức năng là không một phần của C99 nhưng là một phần của POSIX.

Kích hoạt _BSD_SOURCE hoặc _XOPEN_SOURCE >= 500 hoặc bất kỳ macro thử nghiệm tính năng phù hợp nào khác khai báo chức năng ngẫu nhiên/ngẫu nhiên (xem man feature_test_macrosman srandom).

Điều này có cơ hội tốt, nhưng bạn cần phải tìm ra các macro được xác định/không được xác định ngầm do đó quá bằng cách đọc manpages ở trên.

/usr/bin/colorgcc -std=c99 -D_XOPEN_SOURCE=600 -fgnu89-inline -g -Wall 
    -I/usr/include -I./ -I../ -I../../ -I../../../ -I../../../../ -O3 -o f8 f8.c 
-1

Tôi sử dụng rand() và srand(). BTW: Bạn đã quên một hoặc hai tiêu đề? Ít nhất là cảnh báo thứ hai nói với tôi như vậy.

Hãy thử bao gồm math.h. (Chỉ cần nhớ chúng tôi luôn luôn có vấn đề với thư viện toán học và đã thực sự buộc liên kết nó với -lm).

+0

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

+0

Tôi không thấy bạn đã đề cập đến toán học.h – dirkgently

+0

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

12

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_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-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:

0

tôi đã tạo ra số ngẫu nhiên sử dụng gcc trong CodeBlocks dưới Ubuntu 9.10 (với các tùy chọn trình biên dịch: -std=gnu99 -D_GNU_SOURCE) Vì vậy, đây làm việc cho tôi:

Đây là mã của tôi mà tôi đã chơi với:

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
#include <time.h> 
enum computer {keyboard, CPU, screen, printer}; 
int main(void) 
{ 
    enum computer comp; 
    time_t casovac; 
    comp = CPU; 
    srand(&casovac); 
    printf("%d", rand()); 
    return 0; 
} 

này chỉ được ý tưởng, tất nhiên bạn có thể thực hiện nó bằng cách khác ;-) [Để cài đặt CodeBlocks sử dụng: sudo apt-get install build-essential và sau đó sudo apt-get install codeblocks]

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