할 수 없는 이유는 gcc 찾 random()이 되는 경우 인터페이스-std=c99 니까?

StackOverflow https://stackoverflow.com/questions/575350

  •  05-09-2019
  •  | 
  •  

문제

"#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 #defines __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과 연결해야했습니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top