为何无法将GNU示例代码中extern char标识符program_invocation_short_name改名?
问题原因解答
- 首先明确
extern关键字的作用:extern char *banana;只是给编译器做变量声明,告诉编译器「名为banana的char*类型变量定义在其他编译单元,编译阶段暂时不做定义检查,等链接阶段再查找对应符号的定义」,这个声明本身不会创建变量,也无法实现自定义变量名和glibc内置变量的绑定。 program_invocation_short_name是GNU C库(glibc)内置的全局变量,名称固定写入了glibc的符号表,程序启动时glibc会自动将它初始化为当前程序的短名称(即去掉路径的argv[0]值)。你把变量名改成自定义的banana后,链接器会在所有参与编译的目标文件、依赖库中查找名为banana的符号定义,自然找不到匹配项,就会抛出undefined reference to 'bananas'的链接错误。
如果你确实想用自定义名称指代这个变量,可以用下面两种方式实现,不会触发编译错误:
- 定义别名指针:
extern char *program_invocation_short_name; char *banana = program_invocation_short_name;
- 用宏定义做替换:
#define banana program_invocation_short_name
内容的提问来源于stack exchange,提问作者Gustavo Duarte
相关产品推荐
相关产品推荐

