Por que não pode GCC encontrar a interface aleatório () quando -std = c99 é set?
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?
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
#define
s __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 menos500
(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).