2009-11-23 22 views
8

Tengo el siguiente código C:¿Por qué gcc informa "declaración implícita de la función 'ronda'"?

#include <math.h> 

int main(int argc, char ** argv) 
{ 
    double mydouble = 100.0; 
    double whatever = round(mydouble); 

    return (int) whatever; 
} 

Cuando compilo esto, conseguir las advertencias:

round_test.c: In function ‘main’: 
round_test.c:6: warning: implicit declaration of function ‘round’ 
round_test.c:6: warning: incompatible implicit declaration of built-in function ‘round’ 

estoy oxidado con C, pero pensé que el # include trajo una declaración para round() en el alcance. Revisé mi estándar ANSI (C99 es la única copia que tengo) que confirma que la función round() existe en el encabezado math.h. ¿Que me estoy perdiendo aqui?

Editar: El compilador es GCC 4.3.2 en Ubuntu (intrépido, IIRC). Ejecutando gcc -E da:

$ gcc -E round_test.c | grep round 
# 1 "round_test.c" 
# 1 "round_test.c" 
# 2 "round_test.c" 2 
    double whatever = round(mydouble); 

por lo que la definición obviamente no se encuentra en los encabezados.

Respuesta

17

Veo que está usando gcc.

Por defecto, gcc usa un estándar similar a C89. Es posible que desee "forzar" que utilice el estándar C99 (las piezas que cumple con)

gcc -std=c99 -pedantic ... 

cita de GCC Manual

Por defecto, GCC proporciona algunas extensiones para el lenguaje C que en ocasiones excepcionales entran en conflicto con el estándar C . Consulte Extensiones para la familia de idiomas C . El uso de las opciones -std enumeradas anteriormente deshabilitará estas extensiones donde entran en conflicto con la versión estándar C seleccionada. También puede seleccionar una versión extendida del lenguaje C explícitamente con -std = gnu89 (para C89 con extensiones GNU ) o -std = gnu99 (para C99 con extensiones GNU). El valor predeterminado, si no hay opciones de dialecto del lenguaje C, es dado, es -std = gnu89; esto cambiará a -std = gnu99 en alguna versión futura cuando se complete el soporte C99. Algunas características que son parte del estándar C99 se aceptan como extensiones en el modo C89 .

+1

Gracias, -std = c99 pareció resolverlo. No me había dado cuenta de que Round() era una adición de C99 (y, por supuesto, todas mis referencias son C99 y olvido mencionar esto) –

+0

(mirada sorprendida) ¿Es round() realmente una adición de C99? –

+0

A la derecha, C89 no describió la función 'round()' (por supuesto, los compiladores podrían proporcionarlo como una extensión). – pmg

3

Algo debe estar mal con la instalación de su gcc, los encabezados del sistema o las opciones de compilación.

Intenta compilar con -E. Eso le mostrará lo que produce el preprocesador, incluidos qué encabezados se incluyen y qué hay en ellos. En mi sistema Ubuntu Linux es alrededor de 1.000 líneas de salida, incluyendo esta:

extern double round (double __x) __attribute__ ((__nothrow__)) __attribute__ ((__const__)); 
+0

Estoy en Ubuntu 9.10 (Karmic). Aquí '#include ' loads /usr/include/math.h que carga /usr/include/bits/mathcalls.h que contiene la declaración. –

0

El código se escribe compila limpiamente en MacOS X 10.5.8 con GCC 4.0.1. Si se pincha con las opciones '-Wall -Wextra', se queja de los parámetros no utilizados argc y argv - no material.

¿Ha buscado en <math.h> en su máquina?

¿Has probado con opciones como '-stc = c99'?

3

tiene que decirle a gcc que desea C99, y que desea vincular en libm:

gcc -std=c99 -lm round_test.c 
-2

es necesario enlazar con la biblioteca matemática. Entonces, cuando compile, asegúrese de agregar la bandera -lm.

+1

Gracias por la entrada, pero este es un problema de compilación, no un problema de enlace. Me di cuenta de que había omitido mi comando de compilación (mi mal), pero estaba compilando con gcc -c. –

0

C99 fue la respuesta, pero la historia completa es un poco más complicada. La razón por la que había estado jugando con esto era porque estaba intentando compilar una biblioteca escrita para Windows, que tenía su propia definición "optimizada" de round(). Recibí un error del enlazador al decirme que la definición entraba en conflicto con el built-in, por lo que eliminé la definición (y la declaración). Una vez que lo hice, comencé a obtener el "error de declaración implícita".

Parece que el modo de compilación predeterminado (sin el distintivo -std = c99) no es C89 ni C99: si cumpliera con C89, debería poder proporcionar una definición personalizada de round() sin conflicto, y si se ajustara a C99, la declaración debería estar en math.h.

+1

El modo predeterminado es '-std = gnu89' :) – pmg

Cuestiones relacionadas