我写了一个C程序,正在用GCC编译(用于手臂单片机),我有一个改变void指针地址的函数,指向另一个void,等等。问题是LinkerCompiler认为这段代码未被使用而将其丢弃。 属性((用过)),但没有用。
这些空值和代码都在main.hc文件之外的单独的.h.c文件中,但却包含在main.c中。
代码。
void q2_h(void (*ptr)(uint8_t), uint8_t a) {
if (a == 3) {
ptr = (void*) q3_h;
} else {
ptr = (void*) q22_h;
}
}
定义:
void q2_h(void (*ptr)(uint8_t), uint8_t a)__attribute__((used));
输入指针。
void (*ptr)(void*,uint8_t);
这并不完全正确,因为缺少了(uint8_t),但我不确定其语法。
所以,如果你有任何想法,如何解决这个问题。
问题是,Linker..:
这段代码改变的是一个局部变量 而不是调用代码中的函数指针 所以这不是 "貌似死了",而是真的死了。与其在属性上瞎折腾,不如听听你的编译器想告诉你什么。
始终使用 typedef
当处理函数指针时,这将使错误更加明显。
你不能将一个函数指针投向一个void指针,反之亦然。void*
只是一个通用指针类型,用于 对象指针. 你根本不应该需要投掷,否则你的代码正在尝试可疑的无效指针转换,这将是一个错误。
修正后的代码可能是这样的。
typedef void func_t (uint8_t);
void q2_h(func_t** ptr, uint8_t a) {
if (a == 3) {
*ptr = q3_h;
} else {
*ptr = q22_h;
}
}