2010-09-23 9 views
16

Teniendo en cuenta:typedef Fundamental sintaxis operando

typedef type-declaration synonym; 

puedo ver cómo:

typedef long unsigned int size_t; 

declara size_t como sinónimo de long unsigned int, sin embargo yo (sé que hace pero) no puede ver exactamente cómo:

typedef int (*F)(size_t, size_t); 

declara F como sinónimo de pointer to function (size_t, size_t) returning int

dos operandos de typedef (type-declaration, synonym) en el primer ejemplo son long unsigned int y size_t.

¿Cuáles son los dos argumentos para typedef en la declaración de F o hay quizás versiones sobrecargadas de typedef?

Si hay una distinción relevante entre C y C++ por favor elabore de lo contrario estoy interesado principalmente en C++ si eso ayuda.

+0

Solo para aclarar la fuente de la sintaxis dada inicial es de aquí: http://msdn.microsoft.com/en-us/library /05w82thz%28v=VS.100%29.aspx –

+0

no creas todo lo que Microsoft te dice ;-) –

+0

Las declaraciones del puntero a la función son algunas de las sintaxis más extrañas en C. Lo único que he visto que era más raro era el puntero- sintaxis to-member en C++ ... Y eso es porque se asemeja a la sintaxis del puntero de la función C. –

Respuesta

31

Las declaraciones de tipos que utilizan typedef son las mismas que las correspondientes declaraciones de variables, solo con typedef antepuestas. Así,

 int x; // declares a variable named 'x' of type 'int' 
typedef int x; // declares a type named 'x' that is 'int' 

Es exactamente lo mismo con los tipos de puntero de función:

 int(*F)(size_t); // declares a variable named F of type 'int(*)(size_t)' 
typedef int(*F)(size_t); // declares a type named 'F' that is 'int(*)(size_t)' 

No es un "caso especial"; así es como se ve un tipo de puntero a función.

+0

Esto es muy útil gracias, ahora puedo ver la diferencia de inmediato, lo que todavía es leve confuso es los "dos argumentos", ¿tengo razón al aclarar que para 'typedef int (* F) (size_t);' solo hay un argumento para typedef? –

+1

@Peter: no es realmente una discusión en absoluto; es solo la sintaxis de una declaración. 'int (*) (size_t)' es el tipo de un puntero a una función que devuelve un 'int' y que tiene un único parámetro de tipo' size_t'. Una función a la que apunta un puntero debe tomar un único argumento (de tipo 'size_t'), pero ese es el único" argumento "aquí. –

+3

@Peter: 'typedef' no es una función, no toma argumentos. Convierte una declaración de variable en una declaración de tipo. – GManNickG

0

typedef está utilizando la sintaxis de declaración.

El puntero a la función typedef es el mismo que usaría para declarar un puntero a la función. Excepto en ese caso, usted está declarando un tipo, no variable.

1

En lugar de pensar en typedef como una operación que toma dos parámetros (el tipo y el sinónimo), piénselo como un calificador de tipo. Para declarar una variable llamada F que era un puntero de función aceptar dos size_t parámetros y devolver int que tendría simplemente:

int (*F)(size_t, size_t); 

Añadir el calificador de tipo typedef y en lugar de declarar una variable, que ha declarado un alias de tipo de cambio .

7

Esa no es la sintaxis formal de un typedef, es solo uno de los patrones que puede tomar. En el estándar C 6.7.1, typedef se define sintácticamente como un especificador de clase de almacenamiento (como extern o static). Modifica una declaración, de modo que la declaración declara un alias de tipo en lugar de un objeto.

typedef no es ni una función ni un operador, por lo que las nociones de "argumento", "operando" o "sobrecarga" no se aplican a él. Simplemente le dice al compilador qué clase de declaración está haciendo.

En C++, typedef se define sintácticamente como un decl-especificador, no es un almacenamiento de clase-especificador. especificadores de clase de almacenamiento también son decl-especificadores, y también lo es friend. No creo que esto suponga ninguna diferencia práctica, es otra forma de decir lo mismo que C, pero es 7.1 del estándar C++ si quieres echar un vistazo. Confieso que me desconcierta por el momento.

+0

+1 para referencia de la especificación. – linuxuser27

+0

Esto también es muy útil aunque aún podría aclarar el número de argumentos para typedef, ¿vale la pena incluir la sintaxis correcta de typedef aquí o quizás un enlace para elaborar en su primera oración? –

+2

@Peter: 'typedef' no tiene ningún argumento, al igual que' static' no tiene argumentos, o 'const' no tiene argumentos. Tampoco tiene su propia sintaxis. Es un modificador bloqueado al comienzo de una declaración, por lo que es parte de la sintaxis de la declaración. La sintaxis y la semántica de la declaración básicamente ocupan la totalidad de los capítulos 7 y 8 del estándar C++. –

2

Su hipótesis inicial sobre typedef sintaxis que tiene la estructura

typedef type-declaration synonym; 

es absolutamente incorrecto. La sintaxis de Typedef no tiene esa estructura y nunca la tuvo.

La sintaxis de Typedef es la de una declaración ordinaria, como cualquier otra declaración en lenguaje C. La palabra clave typedef es simplemente un especificador de declaración que indica que el nombre declarado es un nombre typedef, y no una variable, designador de función u otra cosa.

Se pueden utilizar varios declaradores en la misma declaración typedef, por ejemplo

typedef int TInt, *TIntPtr, (*TIntFuncPtr)(void), TIntArr10[10];