2017-01-20 8 views
7

제목에 모두 나와 있습니다. 저는 디폴트 값을 가진 클래스의 멤버 함수에 인수를 추가 할 것입니다. 인수는 사소한 유형의 인수입니다. 이게 ABI를 깬거야? 내 새 라이브러리 버전이 M.m.0이고 M.m-1.x을 사용하는 모든 링크 된 응용 프로그램의 드롭 인 대체품으로 사용 가능하다고 가정 해 봅시다.함수에 기본값을 가진 인수를 추가하면 ABI가 손상됩니까?

샘플 코드 :

// These are some classes: base and child : public base 

/* Version 1.2.3 */ 
class foo() { 
public: 
    void do_that_stuff(const std::string a); 
} 

/* Version 1.3.0 */ 
class foo() { 
public: 
    void do_that_stuff(const std::string a, const base& b = base()); 
} 

PS : 나는 내 자신의 테스트를했고, 그것을 일하고있어. 그냥 확신 할 수 없다.

+4

이름은 모두 그것을 말합니다. 기본 인수는 * 인수 *이며 함수 유형과 관련이 없습니다 (특히 함수 매개 변수 사용). –

+1

_ "이게 ABI를 거꾸로 망가 뜨 렸니?"_ 미안 해요? –

+1

'do_that_stuff'는 이전 컴파일과 새로운 컴파일에서 다른 맹 글링 된 이름을 갖게 될 것입니다. ABI 호환성에 대한 내 정의가 깨지는 것 같습니다. –

답변

10

대부분의 C++ ABI는 심볼 이름에 [member] 함수의 인수 유형을 인코딩합니다. 기본 인수는 일반적으로 호출 시점에 임시 객체가 작성되도록 구현됩니다. 이것이 사용 된 ABI에 대해 수행 된 선택 인 경우 기본 인수를 추가하면 ABI가 변경됩니다. 그렇다면 사용 된 특정 ABI를 결정해야합니다.

+0

호기심으로,이 변화로 인해 부서지지 않을 ABI를 알고 있습니까? – Oliv

+1

@Oliv : 나는 전혀 모른다. 그러나 ABI *는 기본 인수가있는 함수에 대해 여러 기호를 생성 할 수 있습니다. ABI를 깨뜨리지 않고 클래스를 변경하는 접근법이 될 것입니다 (수정 된 함수가'virtual'이 아닌 것으로 가정) : 기본 인수를 사용하는 경우, 다른 인수를 호출하여 모든 argumebts를 호출하고 기본값 인수. –