2011-01-13 57 views
3

因此,我正在研究固件的“快速和脏”分析器 - 我只需要知道某些函数需要多长时间。仅仅打印每次所花费的时间会使结果偏离,因为日志记录很昂贵 - 所以我将一堆结果保存到一个数组并在一段时间后抛弃。直接从其他人访问一个编译单元的静态变量C

当在一个编译单元(一个源文件)中工作时,我只是有一堆存储结果的静态数组。现在我需要在多个文件中执行此操作。我可以“复制粘贴”代码,但那只会是丑陋的(与我一起)。如果我把时间代码放在一个单独的编译单元中,创建静态变量,并在头文件中提供存取函数,那么每次我想访问这些静态变量时,我都会招致函数调用的开销。

是否可以直接访问编译单元的静态变量?

我一直试图封装数据,而不是使用全局变量,但这种情况只是由于速度问题。

我希望这是有道理的!谢谢!

编辑:好了,所以才出现,我问什么是impossible-做任何你看到的替代品,基本上让我直接访问另一个编译单元的数据?

编辑2:谢谢你的答案巴勃罗和乔纳森。我最终接受了Pablo's,因为我没有明确的地方让我得到指向静态数据的指针(根据Jonathan)在我的情况中。再次感谢!

+0

回复:*我一直试图封装数据,而不是使用全局变量*编程没有绝对的规则。为了这个特殊的目的,我想说根据PABlo的答案,可以有一个全局变量。 – JeremyP 2011-01-13 16:51:40

回答

7

不,不可能从另一个编译单元访问static变量。 static关键字精确地防止了这种情况的发生。

如果你需要从另一个访问一个编译单元的全局变量,你可以这样做:

file1.c中:

int var_from_file1 = 10; 

file2.c中:

extern int var_from_file1; 
// you can access var_from_file1 here 

如果可以的话从你的声明中删除static关键字,你应该没问题。我知道改变现有的源代码并不总是一种选择(I.E.处理现有的遗留编译代码)。

3

要从另一个单元C2获取编译单元C1中的静态变量,C1中的某些函数必须指向C2可用的变量的指针,或者某些非静态变量必须包含指向静态变量的指针。所以,你可以将'静态变量'打包到一个单一的结构中,然后编写一个函数返回一个指向该结构的指针;你可以调用该函数来访问静态变量。

类似的规则适用于静态函数;如果文件中的某个函数(或非静态变量)使指向这些函数的指针可用,则可以从文件外部间接调用静态函数。

如果通过指针访问不直接计算,那么你被窥探; static隐藏并且您无法取消隐藏,除非在模块编译时从变量中删除关键字static - 也许可以通过C预处理器。小心名称冲突。