2012-11-03 2 views
7

extern "C"함수 포인터의 형식을 선언하려고합니다. 멤버 변수입니다. 구문은 this question입니다. 컴파일 할 수 없습니다.멤버를 extern "C"함수에 대한 포인터로 선언하는 방법?

template<typename Sig> struct extern_c_fp { 
    extern "C" typedef typename std::add_pointer<Sig>::type func_ptr_type; 
}; 

내가 양쪽에서 extern "C"을 배치 실험 및 typedeftypenametypefunc_ptr_type 사이,하지만 컴파일러 사이의 모든 거부했다. 어떤 제안?

+0

'extern "C"별칭 템플릿을 사용하면이 방법이 효과적입니다. http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1463 –

+2

BTW''extern "C"'가되기 위해서는'Sig'가 필요합니다. 함수 유형에 대한 포인터 추가에는 링키지가 없습니다. 그것은 함수 유형 자체입니다. 함수 유형을 구성 할 때 연결을 유도합니다. 기존 함수 유형의 이름을 지정하는 경우가 아니라 기존 유형이 가지고있는 연결이있는 경우. –

+0

http://liveworkspace.org/code/768027ef00bb0a31e76d8d856ac50801 불평은 적지 만 여전히 문제가 있습니다. – Puppy

답변

1
extern "C" { 
    template<typename R, typename... Args> 
    using extern_c_fp = R(*)(Args...); 
} 

using my_function_ptr = extern_c_fp<void, int, double>; 
// returns void, takes int and double 

이것은 당신이 사용하는 것과 동일한 인터페이스를 사용하지 않지만 Sig의 반환 형식 및 인수 유형을 추출 할 수있는 방법이있을 수 있습니다.

이것은 clang 3.1에서 작동합니다. Xeo는 it didn’t work in GCC를 지적했다. 이것이 어느 컴파일러의 버그인지 잘 모르겠습니다. 따라서 이것을 사용할 때는주의하십시오.

0

당신은 (7.5p4에서) 그런 형식 정의를 선언 할 수 없습니다 :

링키지-사양은 네임 스페이스 범위 (3.3)에서 발생된다.

관련 문제