Namespaces
Variants

inline function specifier

From cppreference.net

인라인 함수 를 선언합니다.

목차

구문

inline function_declaration (C99부터)

설명

inline 지정자의 의도는 컴파일러가 최적화를 수행하도록 힌트를 제공하는 것입니다. 예를 들어 함수 인라이닝 과 같은 최적화는 일반적으로 함수의 정의가 호출 지점에서 보여야 합니다. 컴파일러는 최적화 목적을 위해 inline 지정자의 존재 여부를 무시할 수 있으며(그리고 일반적으로 무시합니다).

컴파일러가 함수 인라이닝을 수행하면 해당 함수의 호출을 함수 본문으로 대체하여 함수 호출 오버헤드(스택에 데이터를 배치하고 결과를 검색하는 작업)를 피합니다. 이로 인해 함수 코드가 여러 번 반복되어야 하므로 실행 파일 크기가 커질 수 있습니다. 그 결과는 함수형 매크로 와 유사하지만, 함수에서 사용된 식별자와 매크로는 호출 지점이 아닌 정의 지점에서 보이는 정의를 참조한다는 점이 다릅니다.

인라이닝이 발생하는지 여부와 관계없이, 인라인 함수의 다음과 같은 의미론이 보장됩니다:

내부 연결을 가진 모든 함수는 다른 제한 없이 static inline 으로 선언될 수 있습니다.

비정적 인라인 함수는 비상수 함수 지역 정적을 정의할 수 없으며 파일 범위 정적을 참조할 수 없습니다.

static int x;
inline void f(void)
{
    static int n = 1; // 오류: 비정적 인라인 함수에서 const가 아닌 정적 변수
    int k = x; // 오류: 비정적 인라인 함수가 정적 변수에 접근
}

비정적 함수가 inline 으로 선언되면, 동일한 번역 단위에서 정의되어야 합니다. extern 을 사용하지 않는 인라인 정의는 외부에서 보이지 않으며 다른 번역 단위에서 동일한 함수를 정의하는 것을 방지하지 않습니다. 이는 inline 키워드를 헤더 파일 내부에서 함수를 정의할 때 static 의 대안으로 사용할 수 있게 하며, 이러한 헤더 파일은 동일한 프로그램의 여러 번역 단위에 포함될 수 있습니다.

함수가 일부 번역 단위에서 inline 으로 선언된 경우, 모든 곳에서 inline 으로 선언될 필요는 없습니다: 최대 하나의 번역 단위는 일반적인 비-인라인 비-정적 함수, 또는 extern inline 으로 선언된 함수를 제공할 수도 있습니다. 이 하나의 번역 단위는 외부 정의(external definition) 를 제공한다고 합니다. 정의되지 않은 동작을 피하기 위해, 외부 링크를 가진 함수의 이름이 표현식에서 사용되는 경우 프로그램에 하나의 외부 정의가 반드시 존재해야 합니다. 일 정의 규칙(one definition rule) 을 참조하십시오.

외부 링크를 가진 인라인 함수의 주소는 항상 외부 정의의 주소이지만, 이 주소가 함수 호출에 사용될 때 인라인 정의 (번역 단위에 존재하는 경우)와 외부 정의 중 어느 것이 호출되는지는 명시되지 않습니다. 인라인 정의 내에서 정의된 정적 객체들은 외부 정의 내에서 정의된 정적 객체들과 구별됩니다:

inline const char *saddr(void) // 이 파일에서 사용하기 위한 inline 정의
{
    static const char name[] = "saddr";
    return name;
}
int compare_name(void)
{
    return saddr() == saddr(); // 명시되지 않은 동작, 한 호출은 외부일 수 있음
}
extern const char *saddr(void); // 외부 정의도 생성됨

C 프로그램은 인라인 버전 또는 외부 버전의 함수가 호출되는지에 의존해서는 안 되며, 그렇지 않을 경우 동작은 명시되지 않습니다.

키워드

inline

참고 사항

inline 키워드는 C++에서 채택되었지만, C++에서는 함수가 inline 으로 선언되면 모든 번역 단위에서 inline 으로 선언되어야 하며, 인라인 함수의 모든 정의는 정확히 동일해야 합니다(C에서는 정의가 다를 수 있으며, 차이점에 따라 결과가 명시되지 않은 동작을 일으킬 수 있습니다). 반면에 C++는 비-const 함수 지역 정적 변수를 허용하며, 인라인 함수의 서로 다른 정의에서 오는 모든 함수 지역 정적 변수는 C++에서는 동일하지만 C에서는 별개입니다.

예제

헤더 파일 "test.h"

#ifndef TEST_H_INCLUDED
#define TEST_H_INCLUDED
inline int sum(int a, int b)
{
    return a + b;
}
#endif

소스 파일 "sum.c"

#include "test.h"
extern inline int sum(int a, int b); // 외부 정의를 제공함

소스 파일 "test1.c"

#include <stdio.h>
#include "test.h"
extern int f(void);
int main(void)
{
    printf("%d\n", sum(1, 2) + f());
}

소스 파일 "test2.c"

#include "test.h"
int f(void)
{
    return sum(3, 4);
}

출력

10

참고문헌

  • C23 표준 (ISO/IEC 9899:2024):
  • 6.7.4 함수 지정자 (p: TBD)
  • C17 표준 (ISO/IEC 9899:2018):
  • 6.7.4 함수 지정자 (p: TBD)
  • C11 표준 (ISO/IEC 9899:2011):
  • 6.7.4 함수 지정자 (p: 125-127)
  • C99 표준 (ISO/IEC 9899:1999):
  • 6.7.4 함수 지정자 (p: 112-113)

참고 항목

C++ 문서 에 대한 inline 지정자