2013-03-18 2 views
2

мой вопрос несколько прост;C ссылки статические функции C++

Можно ли связать C (extern "C") с функциями статического класса 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

Разве это не сильно нарушит переносимость разных компиляторов, так как схемы переключения отличаются? – Skeen

+0

@Skeen - вызывающие функции от ассемблера по сути не переносимы, поэтому нет, он не нарушает ничего, что в настоящее время работает. –

+0

Ну разве это не менее переносимо, чем вызов простой функции c? – Skeen