나는 다음과 같이 간단한 실험, 클래스 정의와 funciton의 정의와 ".H"파일했던 그런 다음헤더 파일에 함수 본문이 들어있어 중복 된 정의로 이어 집니까?
$cat testInline.h
#pragma once
class C{
public:
void f(){}
};
void g(){}
을이 .H 파일의 2 사용자 :
$cat use01.cpp
#include"testInline.h"
void g01(){
g();
C obj1;
obj1.f();
}
$cat use02.cpp
#include"testInline.h"
int main(){
g();
C obj2;
obj2.f();
return 0;
}
내가 그들을 함께 컴파일 오류 가져옵니다
$g++ use01.cpp use02.cpp
duplicate symbol __Z1gv in:
/var/folders/zv/b953j0_55vldj97t0wz4qmkh0000gn/T/use01-34f300.o
/var/folders/zv/b953j0_55vldj97t0wz4qmkh0000gn/T/use02-838e05.o
ld: 1 duplicate symbol for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
정말 이상한 보이는 : 나는 아직도 내가 g (의 중복 정의를보고에서 컴파일러를 중지 할 수 없습니다 "한번의 #pragma"사용했습니다) (__ Z1gv를
inline void g(){}
글쎄, 그것은 컴파일 :
가 그럼 난 testInline.h-> g()의 정의를 수정) 이름 맹 글링으로처럼합니다. C++에서는 "인라인"키워드는 기본적으로 쓸모가 없습니다. 왜냐하면 컴파일러가 함수의 인라인 여부를 결정할 것이기 때문입니다.왜 C 스타일의 함수 g()가 중복을보고하지 않고 .h 파일의 코드를 사용하는 C :: f()가 중복을보고하지 않는 이유는 무엇입니까? 그리고 클래스 C가 "f()"함수에 "인라인"을 추가하지 않아도되는 반면, g()는 "인라인"을 사용해야하는 이유는 무엇입니까?
희망 내 질문을 명확하게 말했습니다. 당신의 도움을 주셔서 감사합니다.
"C++은 함수가"인라인 된 것처럼 "컴파일되도록 요구합니다."재귀 함수를 고려하십시오. ;-) –