Por que não pode GCC encontrar a interface aleatório () quando -std = c99 é set?

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

  •  05-09-2019
  •  | 
  •  

Pergunta

Eu faço "#include <stdlib.h>" no topo da fonte.

Exemplo de compilação:

/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$ 

Quando eu desligar -std = c99, o isFinite function () não pode ser encontrada. Então eu quero usar -std = c99 para esta e outras razões. Existe algum truque que eu estou ausente?

Foi útil?

Solução

man srandom diz que a função é não parte do C99, mas parte de POSIX.

_BSD_SOURCE Ativar ou _XOPEN_SOURCE >= 500 ou qualquer outra macro teste de recurso adequado que declara a função srandom / random (veja man feature_test_macros e man srandom).

Este tem boas chances, mas você precisa descobrir as macros que são definidas / não definido implicitamente, assim, também através da leitura das manpages acima.

/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

Outras dicas

Sim, há um truque que está faltando:. Você pode usar -std=gnu99 vez de -std=c99

-std=c99 #defines __STRICT_ANSI__, que interpreta /usr/include/features.h como "não permitir que qualquer coisa fora do padrão C por padrão" (sem ele, você tem pelo menos tanto _SVID_SOURCE e _BSD_SOURCE). -std=gnu99, por outro lado, meios "C99 mais GNU extensões" (o padrão gcc está neste momento -std=gnu89, seu equivalente C89, que é por isso que você precisava para especificar algo para obter o novo C99 apresenta).

Como alternativa, você pode habilitar as macros de teste recurso (como mencionado na resposta de @ litb). Olhando para /usr/include/stdlib.h no meu sistema, ele espera que um dos __USE_SVID, __USE_XOPEN_EXTENDED, ou __USE_BSD. /usr/include/features.h me diz que as macros de teste recurso que permitam estes são:

  • _SVID_SOURCE (permite __USE_SVID)
  • _BSD_SOURCE (permite __USE_BSD)
  • _XOPEN_SOURCE com um valor de pelo menos 500 (permite __USE_XOPEN_EXTENDED)
  • _XOPEN_SOURCE_EXTENDED (também permite __USE_XOPEN_EXTENDED)
  • _GNU_SOURCE (permite tudo, incluindo as macros de teste de quatro recurso acima)

Para novos programas onde você não está muito preocupado com potenciais colisões de nomes com novas funções de padrões futuros, usando tanto -std=gnu99 e -D_GNU_SOURCE é uma boa idéia. Ele permite que você use todos os novos recursos padrão e extensões GNU, que combinados com algum tipo de retorno (por exemplo, testes de recursos de estilo autoconf) dá mais flexibilidade.

Referências:

Eu criei números aleatórios usando gcc em CodeBlocks sob Ubuntu 9.10 (com opções do compilador: -std=gnu99 -D_GNU_SOURCE), que trabalhou para mim:

Este é o meu código que eu tinha jogado com:

#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;
}

Este foi apenas idéia, é claro que você pode realizá-lo por outros meios ;-) [Para instalar CodeBlocks usar: sudo apt-get install build-essential e depois sudo apt-get install codeblocks]

Eu uso rand () e srand (). BTW: Você esqueceu um cabeçalho ou dois? Pelo menos a segunda advertência me diz isso.

Tente incluindo math.h. (Apenas lembrei que sempre teve problemas com biblioteca de matemática e teve que realmente ligação vigor com -lm).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top