簡體   English   中英

靜態成員函數與C語言綁定?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM