2010-02-24 12 views
29

En C o C++, ¿cuál es la diferencia entre la declaración de función y la firma de función?¿cuál es la diferencia entre declaración de función y firma?

Sé algo de declaración de funciones, pero la función de firma es totalmente nueva para mí. ¿De qué sirve tener el concepto de firma de función? ¿Para qué se usan los dos conceptos?

Gracias!

+4

Formalmente, no hay tal cosa como "función de firma" en C. En C simplemente no hay necesidad de que el concepto de "función de la firma". Tu pregunta es puramente C++. No tiene sentido en C. – AnT

Respuesta

28

Una declaración de función es el prototipo de una función (o puede provenir de la definición de función si el compilador no ha visto ningún prototipo en ese punto) - incluye el tipo de retorno, el nombre de la función y los tipos de los parámetros (opcionalmente en C).

Una firma de función es la parte de la declaración de la función que el compilador usa para realizar una resolución de sobrecarga. Dado que varias funciones pueden tener el mismo nombre (es decir, están sobrecargadas), el compilador necesita una forma de determinar cuál de las varias funciones posibles con un nombre en particular debe resolver una llamada a función. La firma es lo que el compilador considera en esa resolución de sobrecarga. Específicamente, los define estándar 'firma' como:

la información sobre una función que participa en la resolución de sobrecarga: los tipos de sus parámetros y, si la función es un miembro de la clase, la CV-calificadores (si existe) en la función misma y la clase en la que se declara la función miembro.

Tenga en cuenta que el tipo de devolución no forma parte de la firma de la función. Como dice el estándar en una nota a pie de página, "Las firmas de función no incluyen el tipo de devolución, porque eso no participa en la resolución de sobrecarga".

+0

Me gusta el "opcionalmente en C". Muy buena respuesta. –

+1

+1, me gusta esta respuesta mejor que la mía. –

+1

No es exactamente correcto decir que "declaración de función es el prototipo". En C++ es prácticamente correcto, pero terminológicamente erróneo, ya que en C++ no existe el término "prototipo". En C es estrictamente incorrecto porque en C la declaración de función no es necesariamente un prototipo. Por ejemplo, 'void foo();' es una declaración de función que no introduce un prototipo en C. En realidad, se supone que esta pregunta no debe etiquetarse C, ya que no hay ninguna noción de "firma de función" en C. Es puramente una pregunta de C++ y, por esta razón, la respuesta no debería mencionar ningún "prototipo". – AnT

3

La firma de la función no incluye el tipo de retorno o el tipo de enlace de la función.

OK, Wikipedia no está de acuerdo conmigo en el tipo de devolución que se incluye. Sin embargo, sé que el compilador no usa el tipo de devolución al decidir si una llamada a función coincide con la firma. Esta pregunta previa de StackOverflow parece estar de acuerdo: Is the return type part of the function signature?

+0

¿Significa "clase de almacenamiento" la clase a la que pertenece la función? ¿De qué sirve tener el concepto de firma de función? ¡Gracias! – Tim

+0

@Tim: No. Se refieren a la vinculación aplicable. – dirkgently

+0

No daría demasiada credibilidad en el artículo de Wikipedia en este momento. No está bien escrito. El * Firma de método * artículo es un poco mejor. –

6

La norma define dos términos: declaración y definición. Una definición es una declaración tentativa. Sin embargo, los estándares C99 y C++ 03 tienen definiciones ligeramente diferentes.

De C++ 0x proyecto:

Apéndice C

8.3.5 Cambio: En C++, una función declarada con una lista de parámetros vacía lleva a cabo ninguna argumentos. En C, un vacío lista de parámetros significa que el número y el tipo de los argumentos de la función son desconocidos"

Definiciones

1.3.11 firma

el nombre y el tipo de parámetro -list (8.3.5) de una función, así como la clase clase, concepto, mapa conceptual o namespace del cual es miembro. Si una función o plantilla de función esMiembro de la clasesu firma incluye adicionalmente los calificadores cv (si corresponde) y el calificador de ref (si existe) en la función o la plantilla de función misma. La firma de un miembro restringido (9.2) incluye sus requisitos de plantilla . La firma de una plantilla de función adicionalmente incluye su tipo de devolución, su lista de parámetros de plantilla y sus requisitos de plantilla (si corresponde). La firma de una plantilla de función especialización incluye la firma de la plantilla de la cual es una especialización y sus argumentos de plantilla (ya sea explícitamente especificado o deducido). [ Nota: Las firmas se utilizan como base para renombrado de nombres y linking. gama nota]

+1

Gracias, pero me cuesta entender lo que está tratando de decir. – Tim

+0

Conozco la declaración de la función, pero la función de firma es totalmente nueva para mí. ¿De qué sirve tener el concepto de firma de función? ¿Para qué se usan los dos conceptos? – Tim

+2

@Tim: 1) El estándar C no define el término firma. Se utiliza en la literatura de programación general de forma general y, a menudo, es sinónimo de una declaración de función. Tenga en cuenta que las declaraciones de función no necesitan tener parámetros. Las definiciones sí lo hacen, si las estás usando en la definición. 2) Las firmas son ampliamente utilizadas por el compilador para, p. proporcione una definición para un identificador y en el caso de C++ elija la mejor sobrecarga. – dirkgently

0

Una declaración de la función es un prototipo. Una firma de función indica cuál es el tipo de devolución y los parámetros utilizados que componen la firma.Considere esto:

 
int foo(int, int); /* Function Declaration */ 


/* Implementation of foo 
** Function signature 
*/ 
int foo(int a, int b){ 
} 

Ahora, tenga en cuenta este escenario: se pide a un programador de lo que es la firma de la función de foo:

  • devuelve un tipo de datos de int
  • dos parámetros son también del tipo de datos de int, llamado a y b respectivamente

T Por otro lado, el prototipo de función es identificar en el compilador C/C++ qué esperar y si la firma no coincide con el prototipo, el compilador emitirá un error, en el contexto del "error de declaración de función" o 'prototipo no coincide'.

Espero que esto ayude, Saludos cordiales, Tom.

+0

Gracias! Entonces, ¿la firma de la función es la parte de la definición de la función que corresponde a la declaración de la función? – Tim

+0

@Tim: Sí. Exactamente. :) Espero que tenga sentido para ti? – t0mm13b

+0

En C, una declaración de función puede no ser un prototipo: 'int f();' es un ejemplo. –

1

También tenga en cuenta que el const de nivel superior y el argumento volátil no son parte de la firma, de acuerdo con la norma. Pero algunos compiladores se equivocan.

p. Ej.

void f(const int, const char* const); 

tiene la misma firma que

void f(int, const char*); 
Cuestiones relacionadas