如何让LinkerCompiler包含看似 "死 "的代码?

问题描述 投票:1回答:2

我写了一个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),但我不确定其语法。

所以,如果你有任何想法,如何解决这个问题。

c pointers arm
2个回答
4
投票

问题是,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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.