我想知道编译器/链接器是否会删除公共头中已extern
'的全局变量?例如:
// public.h
struct func_ptrs {
void (*foo)(void);
void (*bar)(int);
};
extern const struct func_ptrs DEFAULT_FUNCS;
和
// private.c
#include "public.h"
void def_foo(void) { ... }
void def_bar(int a) { ... }
const struct func_ptrs DEFAULT_FUNCS = { .foo = def_foo, .bar = def_bar };
是否有任何特定的链接器标志允许从生成的二进制文件中删除此变量(和两个函数)?
假设GCC和MSVC是两个目标编译器。
答案 0 :(得分:0)
<强> DEFAULT_FUNCS:强>
由于符号DEFAULT_FUNCS - 由于其范围和修饰符 - 可能会被导出到二进制的符号表以进行(动态)链接,因此无法将其删除。换句话说:链接器(ld)无法确定是否使用符号。
功能def_foo&amp; def_bar 强>
此外,根本没有可以剥离的功能,因为你只是声明它们。实际上,由于def_foo
和def_bar
是未定义的符号,因此链接此二进制文件会失败。
还有一件事:正确的是:
const struct func_ptrs DEFAULT_FUNCS = ...
没有星号,因为你初始化了一个结构,而不是一个指针。