c++ - 如何将 pragma weak 与命名空间函数一起使用?

标签 c++ gcc pragma

这个有效:

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) 为我发出损坏的名称?

最佳答案

在 g++ 中没有稳定的 demangle 方法,原因是 mangling 规则即使在不同的 g++ 版本之间也不可移植。

此外,#pragma weak 是 C 扩展(在 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”规范更适合您。

关于c++ - 如何将 pragma weak 与命名空间函数一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14443336/

相关文章:

c++ - 合并排序算法。合并功能不起作用

c++ - 在 C/C++ 中直接写入内存地址的最短代码是什么?

c++ - GCC 相当于 MSVC 中的/GS、/GL、/Gy、/Oi、/MD

c++ - 与库的 c 绑定(bind)链接

perl - 如何简洁地检查警告类别直至包中层次结构的根部?

c++ - 在可执行文件上重复运行 GDB(并在崩溃/错误时停止)

c++ - 对于确实存在并被使用的制服,OpenGL 返回 -1

c++ - 有序合并问题

c - 为什么这段使用openmp计算Pi值的代码每次给出的答案(最后几个 float )都略有不同?

java - 有什么方法可以在 Java/Eclipse 中对方法进行分组?