所以我正在为固件制作一个“快速而又脏”的探测器 - 我只需知道一些功能需要多长时间。仅仅打印每次所需的时间会使结果产生偏差,因为日志记录很昂贵 - 所以我将一堆结果保存到一个数组并在一段时间之后将其转储。
当在一个编译单元(一个源文件)中工作时,我只有一堆存储结果的静态数组。现在我需要在几个文件中执行此操作。我可以“复制粘贴”代码,但这只是丑陋(跟我一起)。如果我将时序代码放在一个单独的编译单元中,创建静态变量,并在头文件中提供访问器函数,每次我想访问这些静态变量时,都会产生函数调用的开销。
是否可以直接访问编译单元的静态变量?
我一直试图封装数据,而不是使用全局变量,但这种情况只是由于速度问题而需要它。
我希望这是有道理的!谢谢!
编辑:好吧,所以看起来我问的是不可能的 - 你们中有没有人看到基本上允许我直接访问另一个编译单元数据的替代方案?
EDIT2:感谢Pablo和Jonathan的回答。我最终接受了Pablo,因为我没有明确的位置来获取指向静态数据的指针(按照Jonathan的说法)在我的情况下。再次感谢!
答案 0 :(得分:8)
不,不可能从另一个变量访问编译单元的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.处理现有的遗留编译代码)。
答案 1 :(得分:3)
要从另一个单元C2获取编译单元C1中的静态变量,C1中的某些函数必须指向C2可用的变量,或者某些非静态变量必须包含指向静态变量的指针。
因此,您可以将“静态变量”打包到单个结构中,然后编写一个返回指向该结构的指针的函数;您可以调用该函数来访问静态变量。
类似的规则适用于静态函数;如果文件中的某个函数(或非静态变量)指向可用函数的指针,则可以从文件外部间接调用静态函数。
如果通过指针访问不直接计算,那么你就会被愚弄; static
隐藏,除非在编译模块时从变量中删除关键字static
,否则您无法取消隐藏 - 可能是通过C预处理器。请注意名称冲突。