"C"언어 연결을 사용하는 function-taking-one-argument에 대한 포인터에 대한 템플릿에 public typedef
을 추가하려고합니다. 템플릿 내에서 extern- "C"-function 유형을 typedef 할 수 있습니까?
extern "C" {
template <typename return_t_, typename arg1_t_>
struct test
{
typedef return_t_ (*C_fun1_t)(arg1_t_);
};
}
그리고 :
template <typename return_t_, typename arg1_t_>
struct test
{
extern "C" {
typedef return_t_ (*C_fun1_t)(arg1_t_);
}
};
그리고 :
template <typename return_t_, typename arg1_t_>
struct test
{
extern "C" typedef return_t_ (*C_fun1_t)(arg1_t_);
};
을 성공하지.
가능한 것을 달성하려고합니까?
이 모든 것이 'extern'C가 "다른 호출 규칙을 사용할 수도 있습니다"라고 말하면서 문제가 될 수 있지만 거의 발생하지 않을 것입니다. 'extern "C"'가 타입 시스템의 일부가 아니기 때문에, 함수 포인터 타입은이 둘을 구별하지 못한다. 이것은 연결 지정자이다. 즉, * C++에서 만들어진 포인터를 통한 호출은 포인터의 참조가 'extern'C ''인지 여부에 관계없이 작동합니다. 그것은 C에서 호출이 실패 할 수도 있지만, 타입 시스템은 이것을 체크하지 않습니다. –
@ 스티브 : 형식 시스템의 일부입니다. C++ 03 §7.5p1 : "서로 다른 언어 연계가있는 두 가지 함수 유형은 동일하지 않더라도 구별 유형입니다." §5.2.2p1 : "함수 유형이 호출 된 함수 정의의 함수 유형의 언어 연결과 다른 언어 연결을 갖는 표현식을 통해 함수를 호출하는 것은 정의되지 않았습니다." –
@ 프레드 : 오, 오케이. 죄송합니다. 잘못된 정보를 어디에서 골랐는지 모르겠습니다. 또한 함수 포인터를 매개 변수로 사용하는 extern "C"함수를 선언하면 "C"함수 또는 "C++"함수를 사용합니까? 왜냐하면 g ++는 행복하게'-pedantic'을 사용하게합니다. –