首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

一道华为面试题:全局变量可不可以定义在可被多个.c文件包含的头文件中?为什么?解决方案

2012-03-17 
一道华为面试题:全局变量可不可以定义在可被多个.c文件包含的头文件中?为什么?问题如标题所示。答案也很容

一道华为面试题:全局变量可不可以定义在可被多个.c文件包含的头文件中?为什么?
问题如标题所示。答案也很容易在网上搜到,但我写了个例子,怎么都报错!

例子暂时不放上来,免得误导大家思维。

谁能给个可以这样做的例子代码,谢谢
--------------------

PS:
发帖时的给分是什么意思?我好像没有分,抱歉了!

[解决办法]
在某一个.C文件中定义
int Number = 0;
在.h文件中定义
extern int Number;
[解决办法]
//head.h
extern int g_var;/*说明g_var这个变量可能在别的编译单元内*/

//source1.c
#include "head.h"
int g_var; /*通过头文件得知g_var可能在别的编译单元内,但是这里有int g_var,那么g_var的定义就在本单元*/

//main.c
#include "head.h"
可以加extern int g_var,也可以不加
/*通过头文件得知g_var可能在别的编译单元内,编译时保留一个符号,链接的时候在其它单元内寻找*/
[解决办法]
可以,如果在全局变量前加入static或者const(隐式static)
如下
// xxxx.h

...
const double PI = 3.1415926;
static void* NULL = 0;
...
///
这个头文件是可以包含在多个编译单元的
[解决办法]
注意区分:
何为定义?
何为声明?

当然非要钻空子,
用#ifdef 之类的应该也可以把定义放到头文件中,,,
不过c文件也要做一定的配合的

[解决办法]
ls先弄清楚什么是一个编译单元
[解决办法]
例如exp1.c文件中:
#define __EXP1__
#include "exp.h"
exp2.c文件中:
#define __EXP2__
#include "exp.h"
exp3.c文件中:
#define __EXP3__
#include "exp.h"

exp.h文件中:
#ifdef __EXP1__
#define Exp1Extern
#else
#define Exp1Extern extern
#endif
Exp1Extern int nGlobal; /* 此处为全局变量 */

这样一来就可以在这个头文件中定义全局变量了.
[解决办法]
In C, global is treated as a tentative definition because it is without explicit initialization. A tentative definition can occur multiple times within the program. Those multiple instances are collapsed by the link editor, and a single instance is placed within the portion of the program data segment reserved for uninitialized global objects
[解决办法]
晕倒
当然可以了
#ifndef _Unit_1
#define _Unit_1
int Global_1;
//other code
#endif
[解决办法]
从原理上来说是可以的。
在一个头文件中定义一个变量,那么在编译期(cp)是不会出错的。
每个cpp对应的obj里面的.data(或者.bss)段里面都含有这个变量符号,但是在链接(lk)的时候,一般系统会警告提示你说某个变量重复定义等。
假设你能链接程序成功,那么也是有可能的。

如果在头文件里面用extern 声明,但是在多个cpp文件里面进行定义,出现的情况可能是一样的。

上述两中定义,假设你能编译链接成功,但可能使得你的初始化会出现一些意想不到的结果。例如你在cpp1里面给你的定义赋值 a, cpp2里面赋值为b,其实链接的时候,就没法知道到底表示的是几了。可能在不同的机器上编译的结果不一样。
[解决办法]
回lz:

c 和 c++ 的编译器在const问题上确实有一大区别:
c++编译器存在常量折叠(constant folding)机制,在编译过程中会有一个变量替代的过程,所以const int x = 10; 不会出错。
c就没有这种机制,所以会有重复定义的错误。

一个好办法是在某一个cpp文件中定义,在公用的.h文件中extern声明,就不会有错了。
[解决办法]
你搜索的结果才是正确的
全局变量可以定义在.h文件中
不需要#if之类的
关键是不允许在.h中定义的全局两赋初值!
编译好后反汇编可以发现,这个全局量实际只有一个地址
仅在linux gcc下测过

热点排行