할 수 없는 이유는 gcc 찾 random()이 되는 경우 인터페이스-std=c99 니까?
문제
나 "#include <stdlib.h>"
에서 최고의 소스입니다.
예를 컴파일:
/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’
ais@xcalibur:t$
When I 끄-std=c99,기능 isfinite()을 찾을 수 없습니다.그래서 그렇게 나를 사용하고 싶-std=c99 이와 다른 이유가 있습니다.은 거기에 몇 가지 트 나이 없는가?
해결책
man srandom
기능이 있다고 말합니다 ~ 아니다 C99의 일부이지만 Posix의 일부.
활성화 _BSD_SOURCE
또는 _XOPEN_SOURCE >= 500
또는 Srandom/Random 함수를 선언하는 다른 적절한 기능 테스트 매크로 (참조) man feature_test_macros
그리고 man srandom
).
이것은 좋은 기회가 있지만, 위의 맨 페지를 읽음으로써 내재적으로 정의/정의되지 않은 매크로를 파악해야합니다.
/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
다른 팁
Yes,당신을 속이 없:당신이 사용할 수 있는 -std=gnu99
대 -std=c99
.
-std=c99
#define
s __STRICT_ANSI__
, 는 /usr/include/features.h
으로 해석하"사용하지 않도 밖에서 C 표준을 기본적으로"(그것이 없이,당신은 적어도 모두 _SVID_SOURCE
고 _BSD_SOURCE
). -std=gnu99
, 에,다른 한편으로는,의 의미는"C99plus GNU 확장"(gcc 기본값은 현재 -std=gnu89
, 그 C89 해당하는 이유입니다,당신이하는 데 필요한 지정을 얻을 수있는 무언가 새로운 C99 능).
또 다른 방법으로,이 기능을 사용하도록 설정할 수 있습 테스트에 매크로(으로 언급에서@litb 의 답변).보 /usr/include/stdlib.h
내 시스템에서,그것은 예의 하나이 __USE_SVID
, __USE_XOPEN_EXTENDED
, 나 __USE_BSD
. /usr/include/features.h
나에게 말하는 기능을 테스트한 매크로는 사용한다:
_SVID_SOURCE
(가능__USE_SVID
)_BSD_SOURCE
(가능__USE_BSD
)_XOPEN_SOURCE
값이 적어도500
(가능__USE_XOPEN_EXTENDED
)_XOPEN_SOURCE_EXTENDED
(또한 가능__USE_XOPEN_EXTENDED
)_GNU_SOURCE
(할 수 있습을 포함한 모든 것을 네 가지 기능을 테스트하는 매크로 위)
에 대한 새로운 프로그램은 당신에 대해 너무 걱정하지 않은 잠재 이름의 충돌과 함께 새로운 기능에서 미래의 표준을 모두 사용 -std=gnu99
고 -D_GNU_SOURCE
는 것이 좋습니다.그것은 당신을 사용하여 모든 새로운 표준 기능과 GNU 확장,과 결합한 일종의 대체(예를 들어, autoconf
스타일의 기능을 테스트)는 가장 유연합니다.
참고:
Ubuntu 9.10의 CodeBlocks에서 GCC를 사용하여 임의의 숫자를 만들었습니다 (컴파일러 옵션 포함 : -std=gnu99 -D_GNU_SOURCE
) 그래서 이것은 나를 위해 효과가있었습니다.
이것은 내가 한 내 코드입니다.
#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;
}
이것은 유일한 아이디어였습니다. 물론 다른 방법으로 달성 할 수 있습니다 ;-) [코드 블록 사용을 설치하기 위해 : sudo apt-get install build-essential
그리고 sudo apt-get install codeblocks
]
나는 rand () 및 srand ()를 사용합니다. BTW : 헤더를 잊었습니까? 적어도 두 번째 경고는 나에게 그렇게 말해줍니다.
Math.H.를 포함 해보십시오. (방금 우리는 항상 수학 라이브러리에 문제가 있었고 실제로 -LM과 연결해야했습니다).