두 개의 별도 CPP 파일로 정의 된 인라인 함수가 연결 중에 중복 기호를 생성 할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/19843380

문제

나는 온라인에서 많은 자원을 찾습니다 inline (심지어도 __attribute__((always_inline)) 또는 __forceinline)는 컴파일러 (예 : GCC 또는 VisualC ++)가 함수를 인화하도록 강요하지 않습니다. 그러나 언제 정확히 인라인이 시행되지 않습니까? 장난감 예가 있습니까?

아마도 반드시 같은 질문이 아니라 inline 두 가지 다른 CPP 파일에 포함되어 링키지 중에 문제가 발생합니까? 즉, 중복 기호를 생성합니까?

다음은 컴파일러를 깨뜨리고 중복 기호를 생성하기위한 콘크리트 샌드 박스입니다.

~ 안에 myinline.h:

inline int myinline()
{
  // code that cannot be inlined...
  ...
}

~ 안에 aux.cpp:

#include "myinline.h"
int aux()
{
  return my_inline();
}

~ 안에 main.cpp:

#include "myinline.h"
int aux();
int main()
{
  return aux() + my_inline();
}

예를 들어, GCC의 경우 일부 (최소) 코드가 있습니다. myinline 컴파일 및 연결시 중복 기호가 발생합니다.

g++ -o aux.o -c aux.cpp
g++ -o main.o -c main.cpp
g++ -o example aux.o main.o

?

도움이 되었습니까?

해결책

"Inlining"과 "Duplication Symbols"는 다른 것입니다. 그만큼 inline 키워드는 여러 정의를 명시 적으로 허용 할 수 있으므로 (예 : 일 정의 규칙에서 면제) 플랫폼 (컴파일러 및 링커)은이를 처리하고 제거하는 방법을 알아야합니다.

(이것은 헤더에 정의 된 클래스 멤버 기능의 경우 항상 발생합니다.)

당신이 원한다면 코드 생성 이를 위해 기능의 주소를 어딘가에 저장할 수 있습니다.

auto fp = my_inline;

이렇게하면 컴파일러가 주소를 제공 할 수 있도록 기능의 정의를 생성해야합니다. 그러나 모든 번역 장치 에서이 작업을 수행하더라도 링크 시간에 중복 제거되므로 링커 오류가 발생하지 않습니다. 모든 정의가 동일해야한다는 요구 사항은 이것이 잘 정의되어 있는지 확인합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top