мой вопрос несколько прост;C ссылки статические функции C++
Можно ли связать C (extern "C"
) с функциями статического класса C++? - Без использования оберток.
мой вопрос несколько прост;C ссылки статические функции C++
Можно ли связать C (extern "C"
) с функциями статического класса C++? - Без использования оберток.
Нет, вы не можете просто написать функцию обертки.
class X
{
public:
static void f();
};
extern "C" void call_X_f()
{
X::f();
}
Это то, чего я хотел избежать, обертка, которая есть. – Skeen
@Skeen Положите это в свой вопрос. –
Как я уже сказал в комментариях, вы не можете. Но вы можете добиться того же чистого эффекта.
Вот что я говорил:
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
extern "C"
не может быть применен к статической функции-члена. Но поскольку целью является вызов функции из ассемблера, просто используйте искомое имя в коде ассемблера. Здесь нет ничего волшебного; все, что вам нужно - это имя.
Разве это не сильно нарушит переносимость разных компиляторов, так как схемы переключения отличаются? – Skeen
@Skeen - вызывающие функции от ассемблера по сути не переносимы, поэтому нет, он не нарушает ничего, что в настоящее время работает. –
Ну разве это не менее переносимо, чем вызов простой функции c? – Skeen
Поскольку эти функции ограничены, вы не можете избежать использования имени класса там. По-моему, вы можете добиться такого же эффекта с помощью функции друга. – StoryTeller
Ум, проблема в том, что я хочу вызвать статическую функцию C++ из сборки, и я надеялся пойти без глупой функции обертки C++. – Skeen
, если у вас есть контроль над объявлением класса, вы можете использовать обходное решение, описанное ниже. Тот же чистый эффект. – StoryTeller