C语言中变量在不同位置的定义及初始化

本文探讨了在C和C++中头文件中声明和定义变量的区别。C语言允许多次声明同一变量,而C++不允许。在C语言中,如果在头文件中定义并初始化全局变量,会导致重复定义错误;未初始化的全局变量则不会。当定义static变量时,其作用域限制在当前文件,因此在不同.c文件中不会冲突。
摘要由CSDN通过智能技术生成

C语言中变量在不同位置的定义及初始化


  • 问题引入
// mian.c
int b;
int b;
int main()
{
    return 0;
}
  • 运行结果:成功。
// main.cpp
#include <iostream>
int b;
int b;
int main()
{
    return 0;
}

运行结果:

main.cpp:3:5: error: redefinition of ‘int b’
 int b;
     ^
main.cpp:2:5: note: ‘int b’ previously declared here
 int b;
  • 编译运行,该程序不会报错。

  • 原因如下:

    • int b;只是声明而非定义,在C语言中是允许程序对一个变量进行多次声明。而C++则不允许多次声明。
  • 所以会有以下的情况:

C语言中变量的定义

情景一:.h中定义变量并初始化


//var.h
#ifndef DEFINEVAR_VAR_H
#define DEFINEVAR_VAR_H
int a = 0;
#endif //DEFINEVAR_VAR_H
// var.c
#include "var.h"
// mian.c
#include "var.h"
int main()
{
    return 0;
}

编译结果:

CMakeFiles/defineVar.dir/use.c.o:(.bss+0x0): `a'被多次定义
CMakeFiles/defineVar.dir/main.c.o:(.bss+0x0):第一次在此定义
collect2: error: ld returned 1 exit status

情景二:.h中定义变量但不初始化


//var.h
#ifndef DEFINEVAR_VAR_H
#define DEFINEVAR_VAR_H
int a ;
#endif //DEFINEVAR_VAR_H
// var.c
#include "var.h"
// mian.c
#include "var.h"
int main()
{
    return 0;
}

编译结果:

[ 33%] Building C object CMakeFiles/defineVar.dir/main.c.o
[ 66%] Building C object CMakeFiles/defineVar.dir/var.c.o
[100%] Linking C executable defineVar
[100%] Built target defineVar

Build finished

情景三:.h中定义static变量,并初始化/不初始化


//var.h
#ifndef DEFINEVAR_VAR_H
#define DEFINEVAR_VAR_H
static int a = 0;
void printVarA();
#endif //DEFINEVAR_VAR_H

// var.c
#include "var.h"
#include <stdio.h>
void printVarA()
{
    a += 1;
    printf("printVarA: %d\n", a);
}
// mian.c
#include "var.h"
#include <stdio.h>
int main()
{
    printVarA();
    printf("main: %d\n", a);
    return 0;
}
  • 运行结果:
printVarA: 1
main: 0
  • 结论:
    • 头文件定义的static变量在被各个.c引入之后,他们的作用域仅限于本文件,所以一个.c修改该值,其他文件的该变量值不会变。

参考博客链接:

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值