1

これは機能します:

test1.h

namespace funcs {
  extern "C" {
    void a();
    void b();
    void c();
  }
}

test1.cpp

namespace funcs {
  void (*all[])() = {a, b, c};
}
extern "C" void hang() {
  while (true);
}

#pragma weak a = hang
#pragma weak b = hang
#pragma weak c = hang

しかし、これはしません:

test1.h

namespace funcs {
    void a();
    void b();
    void c();
}

test1.cpp

namespace funcs {
  void (*all[])() = {a, b, c};
}
void hang() {
  while (true);
}

#pragma weak funcs::a = hang
#pragma weak funcs::b = hang
#pragma weak funcs::c = hang

#pragma weakこれは、マングルされた名前が必要なためだと思います。コンパイラ (GCC 4.7.3) にマングルされた名前を出力させる方法はありますか?

4

1 に答える 1

2

g++ でデマングルする安定した方法はありません。その理由は、異なる g++ バージョン間でもマングリング ルールを移植できないからです。

また、#pragma weakC 拡張 (gcc/c-family/c-pragma.cファイルで宣言) であり、通常は C++ では動作しません

GCC の開発に関しては、コードを提供#pragma cpp-weakして gcc にコミットするのが正しい解決策ですが、かなり複雑な作業のようです。GCC bugzilla で改善要求を行うことができます。誰かが助けてくれるかもしれません。

C++ 関数のアセンブラ ラベルを自分で宣言し、次のように弱い参照を作成することもできます。

namespace funcs {
    void a()  __asm__("mya");
    void b()  __asm__("myb");
    void c()  __asm__("myc");
}

namespace funcs {
  void (*all[])() = {a, b, c};
}

extern void hang() __asm__("myhang");
void hang() {
  while (true);
}

#pragma weak mya = myhang
#pragma weak myb = myhang
#pragma weak myc = myhang

しかし、「extern C」仕様よりもはるかに優れているかどうかはわかりません。

于 2013-01-22T06:17:33.353 に答える