gpt4 book ai didi

c - 通过剥离未使用的代码来解决 undefined reference

转载 作者:行者123 更新时间:2023-12-02 17:57:45 26 4
gpt4 key购买 nike

假设我们有以下 C 代码:

void undefined_reference(void);

void bad(void) {
undefined_reference();
}

int main(void) {}

在函数 bad 中,我们陷入了链接器错误 undefined reference to 'undefined_reference',正如预期的那样。但是,此函数实际上并未在代码中的任何地方使用,因此,对于程序的执行,此 undefined reference 无关紧要。

是否有可能成功编译此代码,以便 bad 简单地被删除,因为它从未被调用(类似于 JavaScript 中的 tree-shaking)?

最佳答案

这个函数实际上并没有在代码的任何地方使用!

你知道,我知道,但编译器不知道。它一次处理一个翻译单元。它无法预测没有其他翻译单元。

但是 main 不调用任何东西,所以不可能有其他翻译单元!

可以有代码在 main 之前和之后运行(以实现定义的方式)。

好的,链接器呢?它看到了整个程序!

不是真的。代码可以在运行时动态加载(也可以通过链接器看不到的代码)。

因此编译器和链接器都不会尝试查找未使用的函数默认

在某些系统上,可以指示编译器和链接器尝试对未使用的代码进行垃圾回收(并在这样做时假设一个完整的程序 View ),但这通常不是默认的操作模式。

对于 gcc 和 gnu ld,您可以使用这些选项:

gcc -ffunction-sections -Wl,--gc-sections main.c -o main

其他系统可能有不同的方式来执行此操作。

关于c - 通过剥离未使用的代码来解决 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75285972/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com