2013-03-18 4 views
2

내 질문은 다소 간단합니다;C C++ 정적 함수를 연결

C++ 정적 클래스 함수에서 C 링크 (extern "C")를 수행 할 수 있습니까? - 래퍼를 사용하지 않고.

+0

이러한 함수의 범위가 지정되었으므로 클래스 이름을 거기에 맹 글링하지 않아야합니다. 그러나 친구 기능으로 동일한 효과를 얻을 수 있다고 생각합니다. – StoryTeller

+0

음, 문제는 어셈블리에서 C++ 정적 함수를 호출하고 바보 같은 C++ 래퍼 함수를 ​​사용하지 않기를 바란다는 것입니다. – Skeen

+0

클래스 선언을 제어 할 수 있다면 아래 설명 된 해결 방법을 사용할 수 있습니다. 같은 그물 효과. – StoryTeller

답변

5

아니요 단순히 래퍼 기능을 작성할 수는 없습니다.

class X 
{ 
public: 
    static void f(); 
}; 

extern "C" void call_X_f() 
{ 
    X::f(); 
} 
+0

이것은 내가 피하고 싶었던 래퍼입니다. – Skeen

+1

@Skeen 질문에 넣으십시오. –

2

내가 코멘트에서 말했듯이, 당신은 할 수 없습니다. 하지만 같은 효과를 얻을 수 있습니다.

는 여기에 내가 얘기 한 내용은 다음과 같습니다

class A; 
extern "C" void foo(A*); 


class A 
{ 
    int i; 
    friend void foo(A*); 
}; 

extern "C" void foo (A* a) 
{ 
    a->i = 10; 
} 

int main() 
{ 
    A a; 
    foo(&a); 
    return 0; 
} 

는 정적 멤버 함수에 적용 할 수 없습니다 GCC 4.7.2 here

+0

이 솔루션을 사용하면 'int i'에 대한 보호 기능을 계속 사용할 수 있습니까? – Skeen

+0

이것이 질문과 어떤 관련이 있는지 알 수 없습니다. –

+0

그냥 궁금 해서요, 그게 전부예요 – Skeen

1

extern "C"에서 잘 컴파일합니다. 그러나 어셈블러에서 함수를 호출하는 것이 목표이므로 어셈블러 코드에서 변형 된 이름을 사용하십시오. 여기에 마술은 없습니다. 이름 만 있으면됩니다.

+0

mangling schemes가 다르기 때문에 다른 컴파일러에서 이식성을 완전히 깨뜨리지 않을까요? – Skeen

+0

@Skeen - 어셈블러에서 호출하는 함수는 본질적으로 이식 가능하지 않으므로 현재 작동하지 않는 함수는 중단되지 않습니다. –

+0

간단한 c 함수를 호출하는 것보다 덜 이식성이 있습니까? – Skeen

관련 문제