Namespaces
Variants

inline function specifier

From cppreference.net

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

inline

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