2010-02-17 17 views
7

estoy revisando algunas bibliotecas de optimización y se encontró con la firma de la función¿Es este estándar válido c?

double solvopt(unsigned short n, 
      double x[], 
      double fun(), 
      void grad(), 
      double options[], 
      double func(), 
      void gradc() 
     ) 

nota que la diversión() y Gard() se hacen pasar como la función. Mi pregunta es si esta es una gramática C estándar válida.

Gracias.

Respuesta

7

El uso de double fun() en lugar de double (*fun)() es una forma arcaica, que sólo era válida en C estándar y no en C++, y si no recuerdo mal, sólo cuando se declara un argumento de función. (muy similar a ary[] que es legal para un argumento de función, pero no para una variable no inicializada)

Dado que no es posible (en C) pasar una función por valor a otra función, el compilador simplemente tomó double fun() para significar un puntero a una función que devolvió un doble.

Así que esto es válido (pero arcaico. ha caído en desuso)

+6

No es cierto sobre C++. La forma es perfectamente válida tanto en C estándar como en C++ estándar. No hay absolutamente nada arcaico al respecto.El tipo de función en declaraciones de parámetros decae a tipo ponter exactamente de la misma manera que el tipo de matriz en las declaraciones de parámetros decae a tipo de puntero. Tanto el trabajo exactamente de la misma forma en C y C++ (aparte del significado de() '' lista parámetro, que está al lado del punto en este caso). – AnT

+0

@AndreyT: entonces extraño que nunca se ve esta forma utilizar, pero voy a cambiar la respuesta –

+0

array '[] 'es legal para una variable cuando se utiliza una lista de inicialización. Array 'int [] = {2, 3, 5, 7, 11, 13};' – wallyk

1

Sus parámetros de matriz (xy opciones) probablemente deberían ser punteros.

En referencia a una función con paréntesis, como "func()" o "gradc()" llama a la función. El nombre de la función solo es un puntero de código que se puede desreferenciar para llamar a la función en cuestión.

En caso de duda, intente compilar esto con un compilador ANSI C: muchos compiladores proporcionan un conmutador de compatibilidad ANSI para hacer cumplir las normas. Además, el K&R book es tu amigo.

¿Es esta una pregunta de tarea?

+0

Se pueden considerar de esa manera, pero en esta declaración 'dobles x []' y 'dobles x' * son equivalentes. –

+0

No señor, esa no es una pregunta para la tarea. Ni siquiera soy un programador de c, pero me piden que revise un código c. – leon

2

func() y gradc() están en la forma apropiada para funciones con parámetros desconocidos. Estoy bastante seguro de que esto era una sintaxis aceptable, incluso para Unix 6 alrededor de 1975.

Los parámetros [] son los mismos que *, tanto ahora como en el pasado. De hecho, recuerdo una disputa sobre 1980 que era más adecuado:

int main (int argc, char **argv, char **envp) 

o

int main (int argc, char *argv[], char *envp[]) 

No hay diferente en efecto. La disputa es la que es más correcta según la semántica.

+1

Siempre he preferido no usar '[]' en los parámetros de función. '* argv []' es más visualmente confuso que '** argv', y si usa corchetes nuevos, los programadores de C pueden pensar que la variable es en realidad una matriz en lugar de un puntero, e intentar un mal' tamaño de (x)/sizeof (x [0]) '-type operación en él. Lo mejor (en mi humilde opinión) para dejar perfectamente en claro que no es una matriz, y no debe tratarse como tal. –

+2

Siempre estuve en la minoría defendiendo ** argv. Estoy feliz de encontrar otro hermano. – wallyk

Cuestiones relacionadas