全局变量引发的问题

创作人 Leo


编辑时间 Sun Mar 14,2021 at 14:16


例:

main.c
int val1 = 2;
int main()
{
    foo() ;
    printf("%d \n", val1);
    return 1;
}

func.c
int val1;
void foo()
{
    val1 = 200;
}
console
# gcc func.c main.c -o d
# ./d
200

由于全局变量符号表是共享的,当变量在多个文件被声明,会造成意想不到的错误

解决方法
1: 保持变量都赋初始值,这样编译器在进行ld链接时,会报错:/tmp/ccCb2WBm.o:(.data+0x0): multiple definition of `val1’
2: 全局变量使用static修饰,这样就不会与其他文件的同名全局变量冲突
3: 编译时,使用gcc参数-fno-common

例:

# gcc -c -fno-common main.c
# gcc -c -fno-common func.c
# gcc -fno-common main.o func.o -o d
func.o:(.bss+0x0): multiple definition of `val1'
main.o:(.data+0x0): first defined here
collect2: ld 返回 1

阅读:447
搜索
  • Linux 高性能网络编程库 Libevent 简介和示例 2409
  • Mac系统编译PHP7【20190929更新】 2239
  • Hadoop 高可用集群搭建 (Hadoop HA) 2049
  • zksync 和 layer2 1990
  • Linux 常用命令 1949
  • 安徽黄山游 1934
  • Hadoop Map Reduce 案例:好友推荐 1889
  • 小白鼠问题 1884
  • Windows 安装Swoole 1850
  • Hadoop 高可用YARN 配置 1847
简介
不定期分享软件开发经验,生活经验