, 통합 될 수없는 함수의 정의 앞에 를 호출하고, 어느 쪽도 재귀 정의 내의 통화). 통합되지 않은 호출이있는 경우 함수는 일반적으로 으로 어셈블러 코드로 컴파일됩니다. 은 해당 프로그램을 이 해당 주소를 참조 할 경우 이 인라인 될 수 없으므로 컴파일 될 때까지 이어야합니다. 함수 정의 특정 용도가 인라인 교체하기에 부적합 할 수 있음은
참고.이러한 사용에는 : varargs 사용, alloca를 사용하는 가변 크기의 데이터를 사용 유형 (가변 길이 참조) 계산 오도의 사용은, 비 로컬 고토 사용 (값으로 라벨 참조)와 중첩 함수 (중첩 된 기능 참조). 인라인으로 표시된 기능을 으로 바꿀 수 없으면 -Winline을 사용하면 경고 메시지가 표시되고 그 이유는 입니다. ISO C++의 요구에 따라
는, GCC는 명시 적으로 인라인 키워드로 선언 없는 경우에도 인라인 를 표시하는 클래스의 신체 내에서 정의 멤버 함수를 고려합니다. 은 이것을 -fno-default-inline으로 대체 할 수 있습니다. C++ 방언 제어 옵션을 참조하십시오. 이 최적화되지 때 `always_inline를 지정하지 않는
GCC는 어떤 기능을 인라인하지 않습니다 '이처럼 기능에 대한 속성 :
/* Prototype. */
inline void foo (const char) __attribute__((always_inline)); The remainder of this section is specific
을 GNU C90 인라인에.
인라인 함수가 정적이 아닌 경우 컴파일러는 이 파일의 호출이있을 수 있다고 가정해야합니다. 전역 심볼은 임의의 프로그램에서 한번만 정의 된 이 될 수 있으므로 함수는 다른 소스 파일에 정의되어서는 안되기 때문에 콜을 통합 할 수 없습니다. 따라서 정적이 아닌 인라인 함수는 항상 자체적으로 에서 컴파일됩니다.
함수 정의에서 인라인과 extern을 모두 지정하면 정의가 인라인에만 사용됩니다. 주소를 명시 적으로 참조하더라도 함수가 에 컴파일되지 않습니다. 이러한 주소 인 은 마치 처럼 함수가 선언 된 경우에만 이고 정의하지 않은 것처럼 외부 참조가됩니다.
인라인과 extern의 조합 인 은 매크로의 영향을 거의받습니다. 사용 방법은 정의를이 키워드로 헤더 파일에 넣고 정의 (인라인 및 extern이 없음)의 다른 복사본을 라이브러리 파일에 넣는 것입니다. 헤더 파일을 에 정의하면 함수에 대한 대부분의 호출이 인라인됩니다 ( ). 이 기능의 사용이 인 경우 은 라이브러리의 단일 복사본을 나타냅니다.
@Ashot에 동의합니다. 질문에 대한 답변을 수락하면 더 많은 사람들이 답변을 기다릴 수 있습니다. 그것이 그대로, 내 대답은 추측에 더 가깝고 실제 "프로"답변이 필요할 수 있습니다. –
아, 나는 그것을 할 필요가 있다는 것을 깨닫지 못했지만 지금은 그렇게 할 것입니다. – emchristiansen