C 如何告诉链接器/编译器包含看似“死”的代码
我已经写了一个C程序,我正在用GCC编译一个arm MCU。 我有一个函数,可以更改void指针的地址,以指向另一个void,依此类推。 问题是链接器/编译器认为代码未使用,并放弃它。 我试过使用属性,但不起作用 空白和代码与main.h/c在单独的.h/.c文件中,但包含在main.c中 代码: 定义:C 如何告诉链接器/编译器包含看似“死”的代码,c,pointers,arm,C,Pointers,Arm,我已经写了一个C程序,我正在用GCC编译一个arm MCU。 我有一个函数,可以更改void指针的地址,以指向另一个void,依此类推。 问题是链接器/编译器认为代码未使用,并放弃它。 我试过使用属性,但不起作用 空白和代码与main.h/c在单独的.h/.c文件中,但包含在main.c中 代码: 定义: void q2_h(void (*ptr)(uint8_t), uint8_t a)__attribute__((used)); 输入指针: void (*ptr)(void*,uint8_
void q2_h(void (*ptr)(uint8_t), uint8_t a)__attribute__((used));
输入指针:
void (*ptr)(void*,uint8_t);
这并不完全正确,因为uint8_t缺失,但我不确定语法
因此,如果您对如何解决问题有任何想法:
该代码更改一个局部变量,而不是调用代码中的函数指针。所以它不是表面上死了,而是真的死了。与其摆弄属性,不如听听编译器想告诉你什么
在处理函数指针时始终使用typedef,这会使错误更加明显
不能将函数指针强制转换为空指针,反之亦然。void*只是对象指针的通用指针类型。您根本不需要强制转换,或者您的代码正在尝试可疑的无效指针转换,这将是一个bug
更正后的代码可能类似于:
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;
}
}
问题:
该代码更改一个局部变量,而不是调用代码中的函数指针。所以它不是表面上死了,而是真的死了。与其摆弄属性,不如听听编译器想告诉你什么
在处理函数指针时始终使用typedef,这会使错误更加明显
不能将函数指针强制转换为空指针,反之亦然。void*只是对象指针的通用指针类型。您根本不需要强制转换,或者您的代码正在尝试可疑的无效指针转换,这将是一个bug
更正后的代码可能类似于:
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;
}
}
为什么要链接死代码?除了不正确之外,该代码实际上什么都不做。它不是表面上死了,而是真的死了。您更改了一个局部变量,而不是调用端的函数指针。为什么要将q3_h和q22_h强制转换为void*?显示这些函数的签名。如果编译器或链接器认为它们未使用,则它们真正未使用的可能性相当高。在工具集不知道的情况下,如何使用任何函数?您不能调用它们,也不能在它们不知道的情况下获取函数的地址……为什么要链接死代码?除了不正确之外,该代码实际上什么都不做。它不是表面上死了,而是真的死了。您更改了一个局部变量,而不是调用端的函数指针。为什么要将q3_h和q22_h强制转换为void*?显示这些函数的签名。如果编译器或链接器认为它们未使用,则它们真正未使用的可能性相当高。在工具集不知道的情况下,如何使用任何函数?你不能调用他们,也不能在他们不知道的情况下获取函数的地址。。。