inline function specifier
Declara una inline function .
Contenidos |
Sintaxis
| inline declaración_de_función | (desde C99) | ||||||||
Explicación
La intención del especificador
inline
es servir como una sugerencia para que el compilador realice optimizaciones, como la
expansión en línea de funciones
, que generalmente requieren que la definición de una función sea visible en el sitio de llamada. Los compiladores pueden (y usualmente lo hacen) ignorar la presencia o ausencia del especificador
inline
para propósitos de optimización.
Si el compilador realiza la inclusión de funciones, reemplaza una llamada de esa función con su cuerpo, evitando la sobrecarga de una llamada a función (colocar datos en la pila y recuperar el resultado), lo que puede resultar en un ejecutable más grande ya que el código de la función tiene que repetirse múltiples veces. El resultado es similar a macros similares a funciones , excepto que los identificadores y macros utilizados en la función se refieren a las definiciones visibles en el punto de definición, no en el punto de llamada.
Independientemente de si se produce la inlining, se garantizan las siguientes semánticas de las funciones inline:
Cualquier función con enlace interno puede declararse
static inline
sin otras restricciones.
Una función inline no estática no puede definir un static local a la función que no sea const y no puede hacer referencia a un static de ámbito de archivo.
static int x; inline void f(void) { static int n = 1; // error: static no constante en una función inline no estática int k = x; // error: función inline no estática accede a una variable estática }
Si una función no estática es declarada
inline
, entonces debe ser definida en la misma unidad de traducción. La definición inline que no utiliza
extern
no es visible externamente y no impide que otras unidades de traducción definan la misma función. Esto convierte a la palabra clave
inline
en una alternativa a
static
para definir funciones dentro de archivos de cabecera, que pueden ser incluidos en múltiples unidades de traducción del mismo programa.
Si una función se declara
inline
en algunas unidades de traducción, no necesita declararse
inline
en todas partes: como máximo una unidad de traducción puede también proporcionar una función regular, no inline y no estática, o una función declarada
extern inline
. Se dice que esta única unidad de traducción proporciona la
definición externa
. Para evitar comportamiento indefinido, debe existir una definición externa en el programa si el nombre de la función con enlace externo se utiliza en una expresión, consulte la
regla de una definición
.
La dirección de una función inline con enlace externo es siempre la dirección de la definición externa, pero cuando esta dirección se utiliza para realizar una llamada a función, no está especificado si se llama a la definición inline (si está presente en la unidad de traducción) o a la definición externa . Los objetos static definidos dentro de una definición inline son distintos de los objetos static definidos dentro de la definición externa:
inline const char *saddr(void) // la definición inline para uso en este archivo { static const char name[] = "saddr"; return name; } int compare_name(void) { return saddr() == saddr(); // comportamiento no especificado, una llamada podría ser externa } extern const char *saddr(void); // también se genera una definición externa
Un programa en C no debe depender de si se llama a la versión en línea o a la versión externa de una función, de lo contrario el comportamiento no está especificado.
Palabras clave
Notas
La palabra clave
inline
fue adoptada de C++, pero en C++, si una función se declara
inline
, debe declararse
inline
en cada unidad de traducción, y además cada definición de una función inline debe ser exactamente la misma (en C, las definiciones pueden ser diferentes, y dependiendo de las diferencias solo resulta en comportamiento no especificado). Por otro lado, C++ permite estáticos de función no constantes y todos los estáticos de función de diferentes definiciones de una función inline son los mismos en C++ pero distintos en C.
Ejemplo
Archivo de cabecera "test.h"
#ifndef TEST_H_INCLUDED #define TEST_H_INCLUDED inline int sum(int a, int b) { return a + b; } #endif
Archivo fuente "sum.c"
#include "test.h" extern inline int sum(int a, int b); // proporciona definición externa
Archivo fuente "test1.c"
#include <stdio.h> #include "test.h" extern int f(void); int main(void) { printf("%d\n", sum(1, 2) + f()); }
Archivo fuente "test2.c"
#include "test.h" int f(void) { return sum(3, 4); }
Salida
10
Referencias
- Estándar C23 (ISO/IEC 9899:2024):
-
- 6.7.4 Especificadores de función (p: TBD)
- Estándar C17 (ISO/IEC 9899:2018):
-
- 6.7.4 Especificadores de función (p: TBD)
- Estándar C11 (ISO/IEC 9899:2011):
-
- 6.7.4 Especificadores de función (p: 125-127)
- Estándar C99 (ISO/IEC 9899:1999):
-
- 6.7.4 Especificadores de función (p: 112-113)
Véase también
|
Documentación de C++
para
inline
specifier
|