请记住这是C代码,不是 C ++ ...
...我有两个模块正在做同样的事情,但在我的micro上的不同接口上。他们需要完全独立运行。
在两个文件中使用相同的命名静态函数集是不好的做法吗?换句话说,两个模块中的几乎所有函数都是静态函数,而静态函数中的几乎所有函数都具有完全相同的名称。
我想我甚至可以问,是不是好练习!
编辑:在回答下面的争论时,这里有一些[部分伪]代码:
static void DiscoverUnits(void)
{
InitBus(); // Where this is one of two buses
RandomiseAddresses(); // Again, one of two buses
while (LongSeachAddress < MaximumLongAddress)
{
// Detect units, assign short addresses calling several functions
// all of which are constantly accessing one of two buses
// This could drag on for 20-30s!
}
}
答案 0 :(得分:3)
主要问题来自你的陈述:
我有两个模块正在做同样的事情,但在我的micro上的不同接口上。他们需要完全独立运行。
从表面上看,你需要创建一大堆代码,这些代码可以配置为在任一特定接口上工作,这样你就有两批支持数据,但只有一份代码。
但是,如果有不可能的原因导致为什么不可能(我很想知道它们是什么),那么在单独的模块中具有与静态函数相同的函数名是允许的,并且工作正常。它可能会使代码搜索变得更难(你会得到关于重复代码的每个问题的两个答案),并且你需要知道如何使用这些函数来运行你的调试器,但是没有理由认为它应该被认为是坏事。 / p>
现在问题有一些示例代码:
static void DiscoverUnits(void)
{
InitBus(); // Where this is one of two buses
RandomiseAddresses(); // Again, one of two buses
while (LongSearchAddress < MaximumLongAddress)
{
// Detect units, assign short addresses calling several functions
// all of which are constantly accessing one of two buses
// This could drag on for 20-30s!
}
}
示例代码可能会修改为更像这样:
struct BusDescriptor
{
const char *bus_name;
uintptr_t bus_lo_address;
uintptr_t bus_hi_address;
uintptr_t bus_search_address;
int num_units;
…
};
static void DiscoverUnits(struct BusDescriptor *bdp)
{
InitBus(bdp); // Where this is one of two buses
RandomiseAddresses(bdp); // Again, one of two buses
while (bdp->bus_search_address < bdp->bus_hi_address)
{
// Detect units, assign short addresses calling several functions
// all of which are constantly accessing one of two buses
// This could drag on for 20-30s!
}
}
如果DiscoverUnits()
函数在一个线程中占用30秒,如果它是可重入的,并且另一个线程也可以同时对另一个总线的数据运行相同的函数,则完全没有问题 - 这是线程提供的那种并发性。
请注意,我假设LongSearchAddress
和MaximumLongAddress
是包含基本相同代码的两个文件中的静态变量。我已将它们翻译成我创建的struct BusDescriptor
类型的引用,以捕获与两条总线之一相关的所有状态。我假设有一个非静态函数,可能是int SetBusDescriptor(struct BusDescriptor *bdp, const char *name)
- 或者更可能是一个稍微复杂的接口 - 可用于设置每个总线的上下文。当创建每个“总线主控”线程时,它将被赋予自己的struct BusDescriptor
指向它要管理的总线。当然,这两个调用将被赋予不同的总线进行管理。