2011-01-25 4 views
3

함수 포인터를 인수 (예 : qsort)로 사용하는 C 표준 라이브러리의 함수를 사용하려는 경우 함수 포인터를 전달하려면 C 함수 여야하므로 extern "C"로 선언해야합니다.qsort를 C++ 함수에 대한 포인터와 함께 호출

extern "C" { 
    int foo(void const* a, void const* b) {...} 
} 

... 
qsort(some_array, some_num, some_size, &foo); 

이것이 잘못된 정보 일 경우 나는 놀라지 않을 것입니다.

+0

참조 : http://www.parashift.com/c++-faq-lite/pointers-to-members.html – Thomi

+0

@Thomi : 위의'foo'는 멤버 함수가 아닙니다. 그러므로 제공된 FAQ 항목은별로 의미가 없습니다. –

+0

@Billy ONeal : [33.2] 실제로 언급합니다. 첫 번째 대답에 대한 내 의견을 참조하십시오. – DaVinci

답변

5

많은 것들은 지금 사용중인 컴파일러에 대한 실질적인 대답에 관심이 있는지 또는 C++의 모든 가능한 구현 구현을 다루는 이론적 인 대답에 관심이 있는지에 따라 달라집니다. 이론 상으로는 필요합니다. 실제로, 당신은 보통 그것없이 얻을 수 있습니다.

진짜 질문은 컴파일러가 C 함수를 호출 할 때보다는 전역 C++ 함수를 호출하는 데 다른 호출 규칙을 사용하는지 여부입니다. 대부분 컴파일러는 동일한 호출 규칙을 사용하므로 extern "C" 선언없이 호출이 작동합니다.

그러나 표준에서는 두 이론에 서로 다른 호출 규칙을 사용하는 컴파일러가있을 수 있습니다. 적어도 컴파일러에 대해서는 잘 모르겠지만, 컴파일러의 수를 감안할 때 알지 못하는 컴파일러가 있다면 놀라지 않을 것입니다.

OTOH, 또 다른 질문이 제기됩니다. C++을 사용하는 경우 왜 qsort을 사용하고 있습니까? C++에서는 std::sort이 거의 항상 바람직합니다. 사용하기 쉽고 대개는 빠릅니다.

+0

사용하기 쉽고 빠르며 ** 유형 안전 **. –

+0

@ 칼 : 좋은 지적. –

+2

'qsort'는 특별 할 수도 있습니다. C++ 표준은''qsort','bsearch','atexit' *는 "C++"링키지와 * "C"링키지를 가진 구현체에 의해 반드시 선언되어야한다고 요구합니다. 다른 표준 C 함수의 경우 구현 정의에 따라 연결 관계가 정의됩니다.나는 이것의 의도 나 효과가 무엇인지 알지 못하며 함수 포인터 매개 변수에 대한 결과가 있는지 여부를 알지 못했지만 콜백을받는 이러한 표준 C 함수가 우연 일 수는 없습니다 C++에서이 추가 요구 사항을 충족해야합니다. –

5

잘못된 정보입니다.

extern C은 C++ 라이브러리를 C 바이너리로 링크해야 할 때 필요합니다. C 링커가 함수 이름을 찾을 수 있습니다. 함수 포인터와 관련한 문제는 아닙니다 (함수가 C 코드에서 이름으로 참조되지 않기 때문입니다).

+3

하지만 링크 @thomi가 주석으로 게시 됨 : 'C 링키지가 'mangling'과 같은 것을 다루지 않기 때문에 실제로 extern "C"비회원 함수 여야합니다. 뿐만 아니라 C와 C++ 사이에서 다를 수있는 호출 규칙도 있습니다. [02.02]의 또는 오해가 있습니까? – DaVinci

+0

@DaVinci : 동일한 플랫폼의 C++ 및 C 용 컴파일러는 일반적으로 동일한 호출 규칙을 사용하기 때문에 이것이 실제로 자주 발생하지는 않지만 공정한 점입니다. –

+0

@DaVinci : 기술적 인 측면을 제외하고 일반적으로 C 함수에 대한 포인터가 필요한 경우 static * member * 함수를 사용할 수도 있습니다. – Clifford

관련 문제