gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 03:24:47 24 4
gpt4 key购买 nike

这个有效:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com