2013-04-07 1 views
3
  1. 헤더 파일에 정의 된 함수는 자동으로 인라인됩니까?
  2. 클래스에서 함수를 선언하고 키워드 인라인을 사용하여 정의를 외부에 제공하면이 함수가 인라인이됩니까? 그렇다면 인라인 함수가 선언문에서 시체를 가져와야한다는 것이 법에 위배되지 않는 이유는 무엇입니까?
+0

가능한 복제 : http://stackoverflow.com/questions/5131771/inline-keyword-in-member-function-definition – JBentley

+0

@JBentley - 그러나이 대답은 ODR을 잘못 적용합니다. –

+0

@Pete 어떤 점에서? – JBentley

답변

1

inline은 컴파일러가이를 존중할 필요가없는 한 "힌트"입니다. 인라인으로 표시하지 않고 인라인으로 표시하는 것을 인라인 할 필요가없는 인라인을 만들 수 있습니다.

그 말은, 당신이 그것에 의존해서는 안된다는 뜻입니다. 오해의 소지가 있으므로 사용하지 않는 것이 좋습니다. 대부분의 현대 컴파일러는이를 무시합니다.

실용적인 용도는 정적 구현을 ​​헤더에 넣을 수있게하는 것입니다. 그것이 좋은 일인지 아닌지는 논쟁의 여지가 있습니다.

+0

고마워요! 인라인 키워드가 사용되지 않아도 헤더 파일에 정의가있을 때 힌트가 자동으로 주어짐을 의미합니까? –

4

헤더 파일에 정의 된 모든 기능이 자동으로 인라인됩니까?

아니요, 클래스 바디 외부에서 정의 된 함수를 손으로 인라인으로 작성해야합니다. 그렇지 않으면 대부분 ODR 위반 (여러 번역 단위의 헤더 포함)이 발생합니다.

는 ISO C는

3.2 하나의 정의 규칙

1 11 + + : 없음 번역 단위가 어떤 변수, 함수, 클래스 형, 열거 형, 또는 템플릿 하나 이상의 정의를 포함 할 수 없다.

[...]

4 모든 프로그램은 정확히 하나의 정의를 포함한다 매 비 인라인 ODR 사용되는 해당 프로그램에 함수 또는 변수; 진단 필요 없음. 정의는 프로그램에서 명시 적으로 나타낼 수도 있고 표준 또는 사용자 정의 라이브러리에서 찾을 수도 있고 (적절할 경우) 암시 적으로 정의 할 수도 있습니다 (12.1, 12.4 및 12.8 참조). 인라인 함수는 odr이 사용되는 모든 변환 단위에서 정의되어야한다. 나는 수업 시간에 함수를 선언하고 키워드 인라인을 사용하여 외부 정의를 주면


,이 기능은 인라인 될 것인가? 그렇다면 인라인 함수가 선언문에서 시체를 가져와야한다는 것이 법에 위배되지 않는 이유는 무엇입니까? 7.1.2/3에있어서,

우선 :

멤버 함수 인라인을 수행하는 방법은 여러 가지가있다

클래스 정의 내에 정의 된 함수는 인라인 함수이다. 인라인 지정자는 블록 범위 함수 선언에 나타나서는 안된다 .90 인라인 지정자가 친구 선언에 사용되면 해당 선언은 정의이거나 함수가 이전에 인라인으로 선언 된 것이어야한다.(고정 또는 비 고정이없이) 또한 클래스 정의 외부에서 정의 될 수있다

인라인 멤버 함수 : 9.3/3 항

struct First 
{ 
    void first(){} 
}; 

제 2, 제 3, 제 4, 클래스 정의에 선언을 제공하거나 클래스 정의 외부에 정의를 제공하면 함수는 인라인으로 선언됩니다. [참고 : 네임 스페이스 범위에있는 클래스의 멤버 함수는 외부와 연결됩니다. 지역 클래스의 멤버 함수 (9.8)에는 연결이 없습니다. 3.5 참조. -end 참고] 클래스 정의 내에 정의

struct STF 
{ 
    void second(); 
    inline void third(); 
    inline void fourth(); 
}; 

inline void STF::second(){} 
void STF::third(){} 
inline void STF::fourth(){} 
+2

문제는 단순히 동일한 항목에 대한 여러 정의 일뿐입니다. ODR은 여러 개의 정의가 허용 될 때 동일해야하며 또한 비회원 함수 일뿐만 아니라 클래스 정의 내에 정의되지 않은 ** 모든 함수 ** –

+0

@PeteBecker " ODR과 관련이 없다 "- 정말로? ODR이"문제는 단순히 동일한 것의 여러 정의가 될 것 "과 관련이 없다는 것을 자세히 설명해 주시겠습니까? –

+2

정말로 같은 이름의 인라인이 아닌 두 개의 정의가있는 경우 ODR은 동일한 기능에 대해 두 가지 정의가 모두 '인라인'으로 표시되면 "th"가되어야한다고 말합니다 e 동일 ". 그래서'인라인 int f() {return 3; } 인라인 int f() {return 4; } '는 ODR을 위반합니다. 'int f() {return 3; } int f() {return 3; }'는 같은 것의 두 가지 정의와 오류입니다. –

6

상관 함수 인라인. inline으로 표시된 기능도 인라인입니다.

class C { 
    int f() { return 3; } // inline 
    int g(); 
    int h(); 
} 


inline int C::g() { return 4; } // inline 
int C::h() { return 5; } // not inline 

이 모든 코드는 헤더에 그 헤더가 당신이 C::h 하나 이상의 정의를 가지고 불만을 얻을 것이다 이상의 번역 단위에 사용됩니다. C::fC::g은 인라인 광고이므로 괜찮습니다. 요즘은 inline의 주된 역할입니다. 동일한 기능을 여러 곳에서 정의 할 수 있습니다 (정의가 "동일"한 경우).