0

我有这个代码

#include <stdio.h>

void test2()
{
    printf("start test2\n");

    printf("end test2\n");
}

void main ()
{

    printf("abc\n");
    #ifdef A
        test2();
    #endif

}

编译它gcc test.c -o test -static -D B

当我运行程序时,我发现它test2没有运行(很好)

但是当我运行字符串时,我可以end test2在二进制文件中看到它。为什么?gcc 不需要编译它!

当我编译这段代码

#include <stdio.h>
void test1();
void test2()
{
    printf("start test2\n");
    test1();
    printf("end test2\n");
}

void main ()
{

    printf("abc\n");
    #ifdef A
        test2();
    #endif

}

gcc test.c -o test -static -D B

gcc 告诉我undefined reference to 'test1'为什么?我不希望那个 gcc 甚至编译函数test2,所以 gcc 不需要知道我使用了那个未定义的函数。

test2当我通过-D不等于时,我能做什么让 gcc 看不到A

4

3 回答 3

3

函数test2仍然可以从外部模块中的函数调用,即使你不在这里调用它,所以函数的定义必须存在。

如果将函数更改为static只能从当前文件中引用,并将优化提高到-O1或更高,则整个函数都会被优化掉。

于 2020-01-09T16:36:39.277 回答
1

你的方法有点像说“如果我不看树,树就不存在了”。这当然不是真的。

如果您不想在程序中包含某个函数,请将其删除。(以及所有对它的引用)

#include <stdio.h>
void test1();

#ifdef A
void test2()
{
    printf("start test2\n");
    test1();
    printf("end test2\n");
}
#endif

int main (void)
{
    printf("abc\n");
    #ifdef A
        test2();
    #endif
}
于 2020-01-09T18:19:18.160 回答
1

默认情况下,链接器不会删除死代码。

使用:-fdata-sections -ffunction-sections -fdce- -Wl,--gc-sections -static命令行选项

于 2020-01-09T16:52:27.127 回答