inline function specifier
인라인 함수 를 선언합니다.
목차 |
구문
| 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
키워드는 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
지정자
|