- 헤더 파일에 정의 된 함수는 자동으로 인라인됩니까?
- 클래스에서 함수를 선언하고 키워드 인라인을 사용하여 정의를 외부에 제공하면이 함수가 인라인이됩니까? 그렇다면 인라인 함수가 선언문에서 시체를 가져와야한다는 것이 법에 위배되지 않는 이유는 무엇입니까?
답변
inline
은 컴파일러가이를 존중할 필요가없는 한 "힌트"입니다. 인라인으로 표시하지 않고 인라인으로 표시하는 것을 인라인 할 필요가없는 인라인을 만들 수 있습니다.
그 말은, 당신이 그것에 의존해서는 안된다는 뜻입니다. 오해의 소지가 있으므로 사용하지 않는 것이 좋습니다. 대부분의 현대 컴파일러는이를 무시합니다.
실용적인 용도는 정적 구현을 헤더에 넣을 수있게하는 것입니다. 그것이 좋은 일인지 아닌지는 논쟁의 여지가 있습니다.
고마워요! 인라인 키워드가 사용되지 않아도 헤더 파일에 정의가있을 때 힌트가 자동으로 주어짐을 의미합니까? –
헤더 파일에 정의 된 모든 기능이 자동으로 인라인됩니까?
아니요, 클래스 바디 외부에서 정의 된 함수를 손으로 인라인으로 작성해야합니다. 그렇지 않으면 대부분 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(){}
문제는 단순히 동일한 항목에 대한 여러 정의 일뿐입니다. ODR은 여러 개의 정의가 허용 될 때 동일해야하며 또한 비회원 함수 일뿐만 아니라 클래스 정의 내에 정의되지 않은 ** 모든 함수 ** –
@PeteBecker " ODR과 관련이 없다 "- 정말로? ODR이"문제는 단순히 동일한 것의 여러 정의가 될 것 "과 관련이 없다는 것을 자세히 설명해 주시겠습니까? –
정말로 같은 이름의 인라인이 아닌 두 개의 정의가있는 경우 ODR은 동일한 기능에 대해 두 가지 정의가 모두 '인라인'으로 표시되면 "th"가되어야한다고 말합니다 e 동일 ". 그래서'인라인 int f() {return 3; } 인라인 int f() {return 4; } '는 ODR을 위반합니다. 'int f() {return 3; } int f() {return 3; }'는 같은 것의 두 가지 정의와 오류입니다. –
상관 함수 인라인. 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::f
및 C::g
은 인라인 광고이므로 괜찮습니다. 요즘은 inline
의 주된 역할입니다. 동일한 기능을 여러 곳에서 정의 할 수 있습니다 (정의가 "동일"한 경우).
- 1. 인라인 함수와 외부 연결
- 2. 클래스 헤더 파일
- 3. C++ 헤더 파일 및 클래스 정의 문제
- 4. 공통 헤더 파일의 외부 클래스 및 클래스의 헤더 파일
- 5. 클래스 헤더 및 구현에 헤더 포함?
- 6. C++ 열거 형 및 인라인 헤더 함수
- 7. 인라인 편집 헤더
- 8. 소스 및 헤더 파일
- 9. 클래스 함수와 Tkinter
- 10. 함수와 구조 대 클래스
- 11. C 인라인 함수와 "정의되지 않은 외부"오류
- 12. 인라인 함수와 QObject :: connect - 예상 표현
- 13. 비 - 클래스 함수와 다른 파이썬 클래스 메서드
- 14. C++ 응용 프로그램에서 c 클래스 및 헤더 파일 사용
- 15. 헤더 파일 및 여러 클래스 용도 (EDIT : forward declarations)
- 16. 헤더, 클래스 및 메인의 열거 형
- 17. 클래스 메서드로 인라인 함수
- 18. 헤더 파일
- 19. VS2008 C++ 헤더 및 클래스 템플릿
- 20. 다른 파일에서 템플릿 함수와 클래스 사용
- 21. 클래스 함수와 비 클래스 함수의 이름 충돌
- 22. PHP 헤더 함수와 $ _SESSION 변수가 작동하지 않습니다.
- 23. 헤더 파일 내에 정적 클래스 멤버 선언
- 24. C++ 헤더 파일 및 포함
- 25. 헤더 변경 및 파일 저장
- 26. jni의 헤더 및 소스 파일
- 27. 헤더 파일
- 28. 함수와 클래스 사이에 형식 시그니처가
- 29. C++ 헤더 파일 규칙
- 30. C++의 헤더 파일에있는 인라인 함수
가능한 복제 : http://stackoverflow.com/questions/5131771/inline-keyword-in-member-function-definition – JBentley
@JBentley - 그러나이 대답은 ODR을 잘못 적용합니다. –
@Pete 어떤 점에서? – JBentley