[英]static member function with C language binding?
以下C ++代碼使用Visual C ++和g ++編譯:
struct S
{
static void foo();
};
extern "C"
void S::foo() {}
struct T
{
static void foo();
};
extern "C"
void T::foo() {}
auto main() -> int
{
S().foo();
T().foo();
}
有效嗎?
如果它是有效的,因為實現可能在一個單獨的翻譯單元中,這是否意味着靜態成員函數總是具有與C函數相同的調用約定(如果不是,它如何不暗示)?
C ++ 11 7.5 / 4“鏈接規范”
在確定類成員名稱和類成員函數的函數類型的語言鏈接時,忽略AC語言鏈接。
所以你的例子在它沒有格式錯誤或錯誤的意義上是有效的,但extern "C"
應該對S::foo()
或T::foo()
沒有影響。
靜態成員函數具有與C函數相同的調用約定。 但是,名稱修改適用。 因此,即使您將靜態成員聲明為extern "C"
,鏈接器也可能在您嘗試將其與調用該函數的C代碼鏈接時找不到它。
你可以輕松做的是聲明一個從普通函數調用靜態成員的包裝器/存根。 此外,您可以將靜態成員函數的地址分配給普通函數指針。
不,它被忽略,問題是名稱修改 (鏈接階段的函數命名)。 所以訣竅是定義一個C函數並使用你的C ++靜態方法作為存根來調用它,如下所示:
struct S
{
static void foo();
};
extern "C" void S_foo_impl();
void S::foo() { S_foo_impl(); }
auto main() -> int
{
S::foo();
}
當然,應該在外部C模塊中定義S_foo_impl
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.