2011-12-10 12 views
6

pg474, K.N.KingInline Definiciones

"The general rule in C99 is that if all top-level declarations of a function in a particular file include inline but not extern, then the definition of the function in that file is inline."

  • ¿Qué es una "declaración de nivel superior de una función" ??

"If the function is used anywhere in the program (including the file that containts its inline declaration), then an external declaration of the function will need to be provided by some other file. When the function is called, the compiler may choose to perform an ordinary call (using the function's external definition) or perform inline expansion (using the function's inline definition). There's no way to tell which choice the compiler will make, so it's crucial that the two definitions be consistent."

  • ¿Qué está diciendo aquí ??

"Variables with static storage duration are a particular problem for inline functions with external linkage"

pero pensé que no podría llamar a una función con enlace externo! El compilador daría un error:

pg 473

"so attempting to call average from another file will be considered an error"

"Consequently, C99 imposes the following restrictions on an inline function with external linkage (but not on one with internal linkage): The function may not define a modifiable static variable. The function may not contain references to variables with internal linkage."

Por qué ?? Si una función es en línea y extern, incluso si declara static int i; dado que la función no puede vincularse, no puede llamarlo, , pero ¿no se creará una variable estática fuera de las funciones en línea stack-frame, por lo que debería poder vincularse a ella? ¿Las funciones en línea tienen un marco de pila? ¿¿Que está pasando aqui??

Respuesta

12

Sé que escribí mucho, pero traté de explicar los conceptos de almacenamiento y vinculación al lado de mis explicaciones de su texto. ¡Espero que esto ayude!

"The general rule in C99 is that if all top-level declarations of a function in a particular file include inline but not extern, then the definition of the function in that file is inline."

What is a: "top-level declaration of a function"??

La declaración de una función se utiliza en forma similar a la declaración de una variable. Es una declaración única que declara el nombre, el tipo de devolución y los tipos de parámetros de una función. Una función definición es el código real de la función.

declaración Ejemplo:

int foo(int bar); 

Ejemplo definición:

int foo(int bar){ 
    return -bar; 
} 

A de nivel superior declaración función es simplemente una declaración de que está en la archivo ámbito de aplicación (es decir, fuera de cualquier bloque) Esto es típicamente donde están todas las declaraciones de funciones, aunque es posible declarar y definir funciones dentro de otras funciones.

"If the function is used anywhere in the program (including the file that containts its inline declaration), then an external declaration of the function will need to be provided by some other file. When the function is called, the compiler may choose to perform an ordinary call (using the function's external definition) or perform inline expansion (using the function's inline definition). There's no way to tell which choice the compiler will make, so it's crucial that the two definitions be consistent."

Huh??? What is he saying here??

Primero de todo, ¿qué es el enlace? El enlace de una variable o función define cómo el compilador tratará múltiples instancias de ese objeto. Los identificadores que no tienen vínculos son siempre 'individuos'. Es decir, las declaraciones múltiples del identificador dentro del programa siempre se tratan como entidades separadas/distintas. Los parámetros de función y las variables locales no tienen ningún enlace. Todas las referencias a un identificador con enlace externo se refieren a la misma entidad. Esta es la palabra clave C 'extern'. Por defecto, los identificadores globales tienen enlaces externos. Esto significa que, por ejemplo, si tiene la variable global "int x;" en dos archivos fuente del programa, se vincularán entre sí y se tratarán como la misma variable.Enlace interno significa que todas las declaraciones del identificador dentro de un archivo fuente se refieren a una sola entidad, pero las declaraciones del mismo identificador en otros archivos fuente se refieren a diferentes entidades. Esta es la forma C de hacer las cosas "privadas" a un archivo. Esta es la palabra clave C 'estática', en el alcance del archivo.

Ahora, volviendo al párrafo. Una función no se puede definir más de una vez. Por lo tanto, los archivos fuente que deseen utilizar funciones de otros archivos fuente deben incluir una declaración externa (que es la información necesaria para realizar la llamada a la función). Lo que este párrafo explica es acerca de qué sucede cuando un archivo tiene una declaración externa a una función en línea. El compilador tiene que elegir si debe o no buscar la definición en línea e insertarla donde se llama a la función, o si debe preservar el enlace externo, haciendo que la ejecución salte al texto del código como normal; y no hay forma de predecir qué elección hará el compilador.

"Variables with static storage duration are a particular problem for inline functions with external linkage"

But i thought you couldn't call a function with external linkage! The compiler would give an error: pg 473 "so attempting to call average from another file will be considered an error"

Si no puede llamar a una función que se define en un archivo fuente diferente (es decir, una función vinculada externamente), C sería un lenguaje muy débil y aburrido de verdad!

"Consequently, C99 imposes the following restrictions on an inline function with external linkage (but not on one with internal linkage): The function may not define a modifiable static variable. The function may not contain references to variables with internal linkage."

Why?? If a function is inline and extern, then even if it does declare a static int i; since the function can't be linked to you can't call it, but won't a static variable be created outside the inline functions stack-frame - so you should be able to link to it? Do inline functions have a stack frame? What's going on here??

A estáticamente almacenada variable es una que no es parte de la pila de ejecución. Su espacio se asigna una vez, antes de que el programa comience a ejecutarse, y existe a lo largo de toda la ejecución. Conservan cualquier valor inicial hasta que se asigna un valor diferente. Las variables globales (alcance del archivo) se almacenan estáticamente de forma predeterminada. Esto está en contraste con variables almacenadas automáticamente, que se asignan en la pila justo antes de que la ejecución del programa ingrese al bloque en el que se declaran, y que se descartan cuando la ejecución abandona ese bloque. Las variables locales (alcance del bloque) son automáticas por defecto.

Volviendo a la pregunta: ¿cuál es el problema con una variable almacenada estáticamente dentro de una función en línea? Una variable almacenada estáticamente dentro de una función vive bajo la suposición de que solo hay una definición de esa función y, por lo tanto, solo una definición de esa variable estática. Pero la delimitación, por definición, es una repetición de la definición de la función para que no tenga que saltar el texto del código durante una llamada a la función. Si existiera una variable estática en la función, entonces tendría que saltar a su ubicación de almacenamiento, frustrando el propósito de la alineación, que es tener una copia de todo "allí mismo". La solución: requiere que la variable no sea modificable, de modo que el compilador pueda alinear el valor permanente.

En su última pregunta: la función en línea tiene un marco de pila: es el mismo marco de pila de la función de llamada, porque el texto de código de la función en línea se copia para evitar la sobrecarga de instrucción estándar de la función externa normal .