2010-04-29 8 views

Respuesta

10

Por lo que yo sé, con C ...

  • la función llamante empuja argumentos en la pila con el fin de derecha a izquierda.

  • la persona que llama es responsable de eliminar los argumentos de la pila después de que se haya ejecutado la función llamada. Probablemente, esto se debe a que se garantiza a la persona que llama saber cuántos argumentos pone en la pila, mientras que la función llamada puede equivocarse.


P.S .:convenciones de llamada son por lo general aplicación específica. Lo que acabo de describir se conoce como la convención de llamadas "cdecl". Contraste esto con una convención de llamadas generalmente conocida como "stdcall", donde la función llamada es responsable de eliminar sus argumentos de la pila. Por eso, no admite listas de argumentos de longitud variable.


P.P.S .: Como usuario nategoose comentado, que no mencionó cómo las listas de argumentos variables son en realidad utilizado. Ver p. POSIX documentation for the <stdarg.h> header para más información.

+2

Esto es muy claro, pero omitió la función del destinatario. El destinatario (como printf) tiene que usar uno o más de los argumentos obligatorios (como la cadena de formato) para saber cuáles deberían ser los parámetros en la pila.A continuación, utiliza macros específicas de destino para acceder a ellas como una matriz (la pila del sistema es una matriz cuya cabeza puede mover). El encabezado stdarg.h contiene las macros que necesita para hacer esto, y generalmente un puntero al encabezado de esta matriz se pasa a una función que espera trabajar en eso (como vprintf). – nategoose

+0

@nategoose: Gracias por su valiosa adición. Solo para hacerte saber, inicialmente dejé esto a propósito, ya que el OP preguntó cómo el * compilador * implementa listas de argumentos variables, no cómo el * programador * realmente los usa. He agregado un hipervínculo a la documentación de referencia ahora. – stakx

7

Las implementa utilizando las mac_va_, por ejemplo va_start. Exactamente lo que hacen estas macros es la implementación definida; en otras palabras, variará de la arquitectura de la CPU a la arquitectura y del compilador al compilador. Pero deben jugar trucos con la pila de llamadas de C. Típicamente, esto implicará tomar la dirección del último parámetro nombrado como una base, y luego acceder a los parámetros variados mediante la realización de la aritmética del puntero en esta base.

+0

Sí, recuerdo que es por eso que siempre necesita un parámetro con nombre antes de ... – dicroce

-1

Mire en va_start, va_arg, y va_end. Here es mucha información sobre esto.

0

En lo que, a medida que triste que ha llegado a esta pregunta en la entrevista de tecnología, voy a suponer que la respuesta correcta sería:

de llamadas empujará parámetros explícitos para apilar, el recuento de los parámetros variables y parámetros variables sí mismo. Luego, el código de función objetivo será responsable de mostrar todos los parámetros en función del recuento aprobado y su dirección de pila.

Y agregue algunas ideas, por qué no es conveniente colocar estos parámetros en una matriz separada.

Cuestiones relacionadas