"무엇을하나요?"라고 대답하는 대신 "내가 원하는 것을 어떻게 할 수 있습니까?"라고 대답합니다. 5 가지 종류의 인라인이 있으며 모두 GNU C89, 표준 C99 및 C ++에서 사용할 수 있습니다.
주소를 사용하지 않는 한 항상 인라인
__attribute__((always_inline))
선언에 추가 한 다음 아래 사례 중 하나를 사용하여 주소를 가져올 가능성을 처리하십시오.
의미론이 필요하지 않은 경우 (예 : 특정 방식으로 어셈블리에 영향을 미치거나를 사용하기 위해 alloca
) 이것을 사용해서는 안됩니다 . 컴파일러는 일반적으로 그만한 가치가 있는지 당신보다 더 잘 알고 있습니다.
인라인하고 약한 기호를 내 보냅니다 (예 : C ++, 일명 "그냥 작동하게").
__attribute__((weak))
void foo(void);
inline void foo(void) { ... }
이렇게하면 동일한 코드의 복사본이 여러 개 남고 링커는 임의로 하나를 선택합니다.
인라인, 그러나 어떤 기호도 방출하지 않음 (외부 참조 남김)
__attribute__((gnu_inline))
extern inline void foo(void) { ... }
항상 방출 (하나의 TU에 대해 이전 문제 해결)
힌트 된 버전은 C ++에서 약한 기호를 내 보냅니다. 그러나 C의 어느 방언에서나 강한 기호를 내 보냅니다.
void foo(void);
inline void foo(void) { ... }
또는 두 언어 모두에서 강력한 기호를 표시하는 힌트없이 수행 할 수 있습니다.
void foo(void) { ... }
일반적으로 정의를 제공 할 때 TU가 어떤 언어인지 알고 있으며 인라인이 많이 필요하지 않을 수 있습니다.
모든 TU에서 인라인 및 방출
static inline void foo(void) { ... }
static
하나를 제외한 모든 항목에 대해 void foo(void)
위에 선언을 추가 할 수 있습니다 . 이것은 깨끗한 헤더를 작성한 다음 #include
인라인 정의가있는 별도의 파일 을 작성하는 "모범 사례"에 도움이됩니다 . 그런 다음 C 스타일 인라인을 사용하는 경우 #define
하나의 전용 TU에서 다른 매크로를 사용하여 라인 외부 정의를 제공합니다.
extern "C"
헤더가 C와 C ++ 모두에서 사용될 수 있는지 잊지 마세요 !