Logo Hardware.com.br
wdr
wdr Membro Senior Registrado
256 Mensagens 3 Curtidas

código em C. compilação com aviso.

#1 Por wdr 15/03/2009 - 13:10
se eu compilo o código abaixo com

$ gcc -o prog prog.c -lm

é apresentado o seguinte aviso:

warning: incompatible implicit declaration of built-in function ‘round’

porém se eu usar

$ gcc -o prog prog.c -lm -std=c99

não há aviso algum.

Eu estou cometendo algum erro em relação ao uso da função round() ? faltou algo no código?


#include <stdio.h>
#include <math.h>

int main(void) {

printf("Round() = %f \n", round(10.2 / 1.3));
}
Obrigado
Wdr
jqueiroz
jqueiroz Cyber Highlander Registrado
104K Mensagens 5.7K Curtidas
#2 Por jqueiroz
16/03/2009 - 15:57
Ele não reclamou de você ter declarado main() retornando um inteiro, e você não estar retornando nada???

Sobre sua pergunta, retirado do manual online ("man round"):

[code=rich]NAME
round, roundf, roundl - round to nearest integer, away from zero

SYNOPSIS
#include

double round(double x);
float roundf(float x);
long double roundl(long double x);

Compile with -std=c99; link with -lm.
[/code]
"chmod 777 nunca ajudou ninguém" (c) 2002-2021 JQueiroz/FGdH
Conheça o Blog do Zekke
pflynn
pflynn Ubbergeek Registrado
5.5K Mensagens 122 Curtidas
#4 Por pflynn
16/03/2009 - 20:39
Em C, diferentemente do que acontece em C++, a declaração de protótipos de funções é opcional, embora recomendada.
Um bom compilador C deve sempre emitir uma advertência quando encontra uma chamada para uma função para a qual não foi encontrada a declaração de um protótipo. A função round que você chama no seu programa entrou para a biblioteca padrão de C a partir do C99. O compilador GNU utiliza o C89 como padrão e suporta o C99 caso você deixe isso explícito. No seu código:

[php]
#include
#include

int main(void) {

printf("Round() = %f \n", round(10.2 / 1.3));
}
[/php]

quando você o compila com o comando:

$ gcc -o prog prog.c -lm

está compilando código C segundo o padrão "C89". Dessa forma, o protótipo da função round está invisível para o compilador. Mesmo assim, o código é valido em C89 (porque protótipos são opcionais) e é compilado sem problemas, mas o compilador emite a advertência informando que o protótipo da função não foi encontrado. Já quando você compila o seu código utilizando a opção -std=c99, está informando ao compilador que você deseja usar o padrão C99 da linguagem, o que faz com que as macros descritas no manual da função rand sejam definidas automaticamente pelo compilador e, consequentemente, com que o protótipo da função rand, que depende dessas macros, fique visível ao compilador. Por isso a advertência não é gerada quando o código é compilado como código C99.
------------------------------------------------
Muito bom. Mas tijolo não revida!
------------------------------------------------
© 1999-2025 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal