C和C++全局变量的一些细节问题
c++中的全局变量
1.可以定义的位置
main函数所在文件的函数体外
其它cpp文件的函数体外
不能放在h文件中,因为h文件可能会有多次引用,会爆重复定义
2.引用方式,c++里面
通过extern 加变量的定义语句的方式 这样所有引用的这个变量只会是一个值
c中的全局变量
1.可以定义的位置
main函数所在文件的函数体外
其它cpp文件的函数体外
不能放在h文件中,因为h文件可能会有多次引用,会爆重复定义
---------------------------------------------------------
为什么可以这样使用?
编译分为编译和链接过程。
每个c,cpp对应一个文件,虽然在外面是不能看见,但是如果使用了extern的话,链接器会将同一名字的变量链接到一个地址,大约是在文件的某个段里面。
因为c++的语法要求更严格,所以要求extern的变量和原变量必须有相同的声明,而c其实就是汇编语言没什么区别,更在乎的是变量的长度,对应类型没有做更多的检查。
---------------------------------------------------------
附录:
c++代码
--------------
main.h
#ifndef _MAIN_H_
#define _MAIN_H_
int g_value = 10;
class b
{
public:
int _value;
void good();
};
#endif
main.cpp
#include "main.h"
#include <iostream>
void b::good()
{
//std::cout<<g_value<<std::endl;
}
good.cpp
#include <iostream>
#include "main.h"
using namespace std;
extern int g_value;
//int g_value;
int main()
{
b obj_b;
cout<<"old g_value:"<<g_value<<endl;
obj_b.good();
g_value = 0x10;
cout<<"new g_value:"<<g_value<<endl;
obj_b.good();
system("pause");
}
-------------------------------------------------------------------
c代码
main.h
#ifndef _MAIN_H_
#define _MAIN_H_
void good();
#endif
main.c
#include "main.h"
#include <stdio.h>
int g_value = 10;
void good()
{
printf("main.c print %d\n", g_value);
}
good.c
#include <stdio.h>
#include <stdlib.h>
#include "main.h"
extern char g_value;
//extern int g_value; 注意类型不一样在c里面是不会爆编译错误的
//int g_value;
int main()
{
printf("old value:%d\n", g_value);
g_value =0x10;
printf("new value:%d\n", g_value);
system("pause");
}
摘自 RunBoying
补充:软件开发 , C++ ,