일단 예시부터
test.h
class cls {
int a;
public :
cls();
}
test.cpp
cls::cls()
{ a = 100; }
main.cpp
auto main() -> int
{ cls sample; }
이건 정상적으로 코딩되는데
여기서 test.cpp에서 cls()에 inline을 붙히고 위 메인함수처럼 기본생성자로 인스턴스를 만들면
Undefined symbols for architecture x86_64:
"__ZN3clsC1Ev", referenced from:
__Z9print_varv in main.cpp.o
ld: symbol(s) not found for architecture x86_64
뭐 대충 이런식으로 심볼을 찾지를 못함.
웃긴건 인자를 가진 생성자나 복사, 이동 생성자등은 또 인라이닝이 되고
인라이닝된 기본생성자 함수 정의를 헤더파일로 옮겨버리거나 선언부에서 바로 정의하면 그건 또 됨.
이렇게 되는 이유가 궁금한데 관련 정보나 키워드 좀 알려줄 수 있음?
clang에선 컴파일 에러 나네
어이없는 건 글 말대로 복사, 이동 생성자는 인라이닝 됨
그건 복사, 이동 생성자를 안 썼기 때문에 찾으려 시도하지 않는 거 아님?
컴파일 에러는 나지 않는데 함수 내의 출력이 실행 안됨
댓글이 안 달리길래 vpn 재연결 했는데도 안돼서 쿠키 지우고 하니까 달림
복사, 이동 생성자로 성공하는 코드가 어떻게 생긴 건지 Gist 같은 거로 올려줄 수 있음?
에러 나는 거 안 나는 거 구분해서 올림
https://pastebin.com/nN36Mk8V
Foo foo{Foo()} 이러니 기본 생성자가 호출됨
그냥 괄호 쓴 거는 함수 선언으로 처리되더라
중괄호 쓴 건 elision이 일어나는 거 같은데 정확히는 모르겠다
LTO켜고 컴파일하면 인라인되지 않음?
gcc, clang 둘 다 에러임
LTO 옵션도 안 먹힘? ㄷㄷ
나도 듣고 한 번 해봤는데 LTO 해도 gcc, clang 둘 다 안됨
LTO 쓰면 inline 키워드 필요없던 걸로 기억함.
https://en.cppreference.com/w/cpp/language/inline#Explanation
inline
키워드를 쓰면 같은 translation unit 안에서만 그 함수를 찾을 수 있기 때문에 안 됨.
이거 버그 아니냐? 복사랑 이동 생성자도 complain 해야하는데 안하잖아