2009-08-07 2 views

답변

0

수 있습니다.

그러나 __list_add()에 코드를 공유 할 수있는 다른 공개 항목이있을 수 있습니다. 예를 들어, push() 또는 insert_head() 또는 그와 비슷한 것이있을 수 있습니다.

참고 : C++ 인 경우 예약어이므로 변수 new을 다시 호출 할 수 있습니다.

+0

이것은 분명히 C++이 아니며 C++에서 완전히 중복 된 struct 한정자를 참조하십시오. – EFraim

2

코드 재사용 및 중복 방지에 관한 내용입니다.

__list_add()에는 이보다 더 많은 상황에서 유용한 코드가 들어 있으며 여러 다른 기능간에 공유 할 수 있습니다. __list_add()에 버그가 있다면

  • 당신은 그것을 수정 프로그램을 얻을 사용하여 모든 기능을 수정 :이 같은

    공유 코드는 몇 가지 장점이 있습니다.

  • __list_add()이 향상되면 (예 : 더 빠르게 만들 때) 모든 기능이 빨라집니다.
  • 항목을 목록에 추가하는 방법을보고 싶을 때 한 곳만 볼 수 있습니다.
0

__list_add는 내부적으로 여러 용도로 사용되는 "개인"내부 기능으로 사용됩니다. list_add에 대한 대중의 관심은 그 주위에 편리한 래퍼로서 존재합니다.

3

코드를 복사하면 유지 관리가 어려워집니다. 이 예에서 간접 참조의 추가 레벨은 매개 변수를 숨 깁니다. 012 대신에 2 개의 매개 변수가있는 함수를 제공합니다.

__list_add() 안의 코드를 복사하면 여러 위치에 복사해야합니다. 목록 메커니즘이 다소 변경되면이 모든 장소를 업데이트해야하거나 버그가 팝업되기 시작합니다 (예 : 목록의 FIFO 및 LIFO 구현이 다른 동작을 표시 함).

항상 상충 관계가 있습니다. 또 다른 수준의 간접 지정은 코드 줄을 복제하거나 API에 많은 매개 변수를 갖는 것과는 달리 복잡성과 오버 헤드를 추가합니다.

+0

+1은 spot_add가 2를 취하고 __list_add가 3 개의 매개 변수를 취한다는 것을 나타냅니다. –

0

이 래퍼는 inline입니다. __List_add의 본문을 추가 한 경우에도 인라인됩니다. apaprent 목표는 여분의 head->next 인수를 밀어 넣는 것 뿐이며 다른 것은 아무것도 삽입하지 않는 것입니다.

+0

'inline'은 인라인을 보장하지 않습니다. – EFraim

+0

실제로, 보증의 부족은 여기서 관련이 없습니다. 그리고 컴파일러가 함수의 절반을 인라인 할 수있는 방법과 같은 모든 세부 사항을 설명해야한다면 내 반응이 오랫동안 부조리가 될 것입니다. – MSalters

0

이 기능은 리눅스 커널에서 제공됩니다.

가보세요 : __list_add()

__list_add()가 많은 장소에서 사용됩니다 는 일반리스트의 구현에 속하는 예를 들어,목록 머리에 요소를 추가하는 list_add(), 목록 꼬리에 요소를 추가하는 list_add_tail() ... 지정된 위치에 요소를 삽입하는 데에도 사용할 수 있습니다.

0

재귀 함수에 대한 래퍼 함수를 ​​정의하여 초기 매개 변수가 올바르게 설정되도록하는 것이 일반적입니다.

은 바이너리 호환성을 유지하기 위해 할 수 Recursion (computer science)

0

에 대한 위키 피 디아에 이진 검색을 참조하십시오. ABI 불변성을 유지할 수있는 간접 지정이 있습니다. http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html

에서

도서관의 새로운 버전 불리는 변경할 필요가 이전 와 바이너리 호환되지 않는 경우.

  1. 더 이상 그 원래 사양을 충족하도록 기능 변경의 동작,
  2. 수출 데이터 항목 : C에서, 는 라이브러리 바이너리 호환을 상실 할 네 가지 기본 이유가있다 변경 (예외 : 구조의 끝이 에 선택적 항목을 추가하면 해당 구조가 라이브러리 내에 으로 할당되어있는 한 으로 끝납니다.)
  3. 내 보낸 함수가 제거되었습니다.
  4. 내 보낸 함수의 인터페이스가 변경됩니다.
관련 문제