C语言中变量在不同位置的定义及初始化
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
修改该值,其他文件的该变量值不会变。
- 头文件定义的