如何在命名空间函数中使用pragma weak
How can I use pragma weak with namespaced functions?
这行得通:
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++中没有稳定的修改方式,原因是修改规则即使在不同的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"规范更适合你。
相关文章:
- 在头文件和 cpp 文件中使用一次 #pragma 时出现结构重定义错误
- #pragma 包(1)会导致分段错误
- 禁止显示有关包含文件中 #pragma 包的警告
- 编译时检查 #pragma 包的使用情况
- OpenMP #pragma omp for v/s #pragma omp parallel for 之间的区别?
- 为什么"weak.lock()"返回"nullptr" "auto weak=std::make_shared<int>(42);"的定义?
- #pragma(*诊断)当将Clang分析器与GCC编译器混合时
- #pragma 警告不适用于 catch 语句
- (2 问题)"类"类型重新定义(即使 #pragma 一次),以及静态函数内的静态成员对象初始化?
- 函数中的"pragma omp parallel for"在另一个并行循环中调用函数时无效
- 为什么使用模板生成的函数具有"weak"符号类型?
- 如果没有 #pragma pop_macro #pragma push_macro 会发生什么?
- 为什么 #pragma 一次不防范多个非 constexpr 定义?
- 添加#pragma循环后出现Segfault
- 使用 #pragma 一次,#ifndef 在同一文件中包含保护
- #pragma 模板功能的链接
- 试图了解C++#pragma Arduino 中区域的使用情况
- #pragma 启动和 #pragma 退出的用例
- #pragma 包的奇怪行为
- 如何在命名空间函数中使用pragma weak