4

所以我正在为固件开发一个“快速而肮脏”的分析器——我只需要知道某些功能需要多长时间。仅仅打印每次花费的时间会扭曲结果,因为日志记录很昂贵——所以我将一堆结果保存到一个数组中,并在一段时间后将其转储。

在一个编译单元(一个源文件)中工作时,我只有一堆静态数组来存储结果。现在我需要跨多个文件执行此操作。我可以“复制粘贴”代码,但这会很难看(请耐心等待)。如果我将计时代码放在单独的编译单元中,制作静态变量,并在头文件中提供访问器函数,那么每次我想访问这些静态变量时都会产生函数调用的开销。

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

我一直试图封装数据,而不是使用全局变量,但这种情况只是出于速度考虑而需要它。

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

编辑:好吧,看来我要问的是不可能的-你们中的任何人是否看到基本上允许我直接访问另一个编译单元的数据的替代方案?

EDIT2:谢谢你的回答巴勃罗和乔纳森。我最终接受了 Pablo's,因为在我的情况下我没有明确的位置来获取指向静态数据的指针(根据乔纳森的说法)。再次感谢!

4

2 回答 2

8

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

如果您需要从另一个编译单元访问一个编译单元的全局变量,您可以执行以下操作:

文件1.c:

int var_from_file1 = 10;

文件2.c:

extern int var_from_file1;
// you can access var_from_file1 here

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

于 2011-01-13T16:30:52.167 回答
3

要从另一个单元 C2 获取编译单元 C1 中的静态变量,C1 中的某些函数必须使指向 C2 可用的变量的指针,或者某些非静态变量必须包含指向静态变量的指针。

因此,您可以将“静态变量”打包成一个结构,然后编写一个返回指向该结构的指针的函数;您可以调用该函数来访问静态变量。

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

如果通过指针访问不算直接,那么你就被打脸了;static隐藏并且您无法取消隐藏,除非在static编译模块时从变量中删除关键字 - 可能通过 C 预处理器。谨防名称冲突。

于 2011-01-13T16:47:31.093 回答