Namespaces
Variants

inline specifier

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

inline 지정자는 함수의 decl-specifier-seq 에서 사용될 때, 해당 함수를 인라인 함수 로 선언합니다.

클래스/구조체/공용체 정의 내부에서 완전히 정의된 함수는, 그것이 멤버 함수이거나 비-멤버 friend 함수인지 여부에 관계없이, 암시적으로 인라인 함수입니다 명명된 모듈에 부착된 경우를 제외하고 (C++20부터) .

첫 번째 선언에서 constexpr 또는 consteval (C++20부터) 로 선언된 함수는 암시적으로 인라인 함수입니다.

삭제된 함수는 암시적으로 인라인 함수입니다: 해당 (삭제된) 정의는 둘 이상의 번역 단위에 나타날 수 있습니다.

(C++11부터)

정적 저장 기간을 가진 변수(정적 클래스 멤버 또는 네임스페이스 범위 변수)의 decl-specifier-seq 에서 사용될 때, inline 지정자는 해당 변수를 인라인 변수 로 선언합니다.

첫 번째 선언에서 constexpr 로 선언된 정적 데이터 멤버는 암시적으로 인라인 변수입니다.

(C++17부터)

목차

설명

인라인 함수 또는 인라인 변수 (C++17부터) 는 다음과 같은 속성을 가집니다:

  • 인라인 함수 또는 변수 (C++17부터) 의 정의는 해당 함수가 접근되는 번역 단위에서 도달 가능해야 합니다(반드시 접근 지점 이전일 필요는 없음).
  • 외부 링크age 를 가지는 인라인 함수 또는 변수 (C++17부터) (예: static 으로 선언되지 않은 경우)는 다음과 같은 추가 속성을 가집니다:
  • 인라인 함수 또는 변수 (C++17부터) 는 각 정의가 서로 다른 번역 단위에 나타나고 (비정적 인라인 함수 및 변수의 경우 (C++17부터) ) 모든 정의가 동일하다면 프로그램 내에서 여러 개의 정의 가 존재할 수 있습니다. 예를 들어, 인라인 함수 또는 인라인 변수 (C++17부터) 는 여러 소스 파일에 포함되는 헤더 파일에서 정의될 수 있습니다.
  • 모든 번역 단위에서 inline 으로 선언되어야 합니다.
  • 모든 번역 단위에서 동일한 주소를 가집니다.

인라인 함수에서,

  • 모든 함수 정의 내의 함수 지역 정적 객체는 모든 번역 단위에서 공유됩니다(이들은 모두 하나의 번역 단위에 정의된 동일한 객체를 참조합니다).
  • 모든 함수 정의 내에서 정의된 타입들도 모든 번역 단위에서 동일합니다.

인라인 const 변수들은 네임스페이스 범위에서 기본적으로 외부 링크 를 가집니다 (인라인이 아닌 비휘발성 const 한정 변수들과는 다르게).

(C++17부터)

inline 키워드의 원래 의도는 함수 호출보다는 함수 인라인 확장 이 선호된다는 것을 최적화 프로그램에 지시하는 것이었습니다. 즉, 함수 본문으로 제어를 전달하기 위한 함수 호출 CPU 명령어를 실행하는 대신, 호출을 생성하지 않고 함수 본문의 사본이 실행됩니다. 이는 함수 호출로 인한 오버헤드(인수 전달 및 결과 검색)를 피할 수 있지만, 함수 코드가 여러 번 반복되어야 하므로 더 큰 실행 파일이 될 수 있습니다.

표준 의미론에서 인라인 치환은 관찰할 수 없기 때문에, 컴파일러는 inline 으로 표시되지 않은 어떤 함수에 대해서도 자유롭게 인라인 치환을 사용할 수 있으며, inline 으로 표시된 어떤 함수에 대해서도 자유롭게 함수 호출을 생성할 수 있습니다. 이러한 최적화 선택은 위에 나열된 다중 정의 및 공유 정적 변수에 관한 규칙을 변경하지 않습니다.

C++98 이후로 함수에 대한 inline 키워드의 의미가 "인라이닝이 권장된다"보다는 "여러 정의가 허용된다"를 의미하게 되었기 때문에, 이 의미가 변수로도 확장되었습니다.

(since C++17)

참고 사항

외부 링크를 가진 인라인 함수 또는 변수 (C++17부터) 가 서로 다른 번역 단위에서 다르게 정의된 경우, 프로그램은 진단 없이도 잘못된 형식입니다.

inline 지정자는 블록 범위(다른 함수 내부)에서 함수 또는 변수 (C++17부터) 선언과 함께 사용할 수 없습니다.

inline 지정자는 이미 번역 단위에서 non-inline으로 정의된 함수 또는 변수 (C++17부터) 를 재선언할 수 없습니다.

암시적으로 생성된 멤버 함수와 첫 번째 선언에서 기본값으로 선언된 모든 멤버 함수는 클래스 정의 내부에서 정의된 다른 함수와 마찬가지로 인라인 함수입니다.

인라인 함수가 다른 번역 단위에서 선언된 경우, 누적된 기본 인수 집합은 각 번역 단위의 끝에서 동일해야 합니다.

C에서는 인라인 함수가 모든 번역 단위에서 inline 으로 선언될 필요가 없으며 (최대 하나만 비- inline 이거나 extern inline 일 수 있음), 함수 정의들은 동일할 필요가 없지만 (단, 프로그램의 동작이 어떤 정의가 호출되는지에 따라 달라지는 경우 그 동작은 명시되지 않음), 그리고 함수 내부의 정적 변수들은 동일한 함수의 서로 다른 정의들 사이에서 별개입니다.

인라인 정적 멤버에 대한 추가 규칙은 static data members 를 참조하십시오.

인라인 변수는 C++ 코드를 헤더 전용 라이브러리로 패키징하는 주요 장애물을 제거합니다.

(since C++17)
기능 테스트 매크로 표준 기능
__cpp_inline_variables 201606L (C++17) 인라인 변수

키워드

inline

예제

헤더 파일 "example.h":

#ifndef EXAMPLE_H
#define EXAMPLE_H
#include <atomic>
// 여러 소스 파일에 포함되는 함수는 inline으로 선언해야 합니다
inline int sum(int a, int b)
{
    return a + b;
}
// 외부 링크를 가지며 여러 소스 파일에 포함되는 변수는 inline으로 선언해야 합니다
inline std::atomic<int> counter(0);
#endif

소스 파일 #1:

#include "example.h"
int a()
{
    ++counter;
    return sum(1, 2);
}

소스 파일 #2:

#include "example.h"
int b()
{
    ++counter;
    return sum(3, 4);
}

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
CWG 281 C++98 friend 함수 선언이 inline 지정자를 사용할 수 있었음
friended 함수가 inline 함수가 아닌 경우에도
이러한 사용 금지
CWG 317 C++98 함수가 non-inline 정의가 동일 번역 단위에 선언보다
먼저 존재하는 경우에도 inline으로 선언될 수 있었음
이 경우 프로그램이
ill-formed
CWG 765 C++98 inline 함수 내에서 정의된 타입이 서로 다른 번역 단위에서
다를 수 있었음
이러한 타입들은 모든 번역 단위에서
동일함
CWG 1823 C++98 inline 함수의 모든 정의에 있는 문자열 리터럴들이
모든 번역 단위에서 공유됨
일관성과 구현 사항으로 인해
요구사항 제거됨
CWG 2531 C++17 정적 데이터 멤버가 첫 번째 선언에서 constexpr
선언되지 않았더라도 암시적으로 inline일 수 있었음
이 경우 암시적으로
inline이 아님

참고 항목

C 문서 참조: inline