Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何告诉链接器/编译器包含看似“死”的代码_C_Pointers_Arm - Fatal编程技术网

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_

我已经写了一个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_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*?显示这些函数的签名。如果编译器或链接器认为它们未使用,则它们真正未使用的可能性相当高。在工具集不知道的情况下,如何使用任何函数?你不能调用他们,也不能在他们不知道的情况下获取函数的地址。。。