在不同的C模块中使用具有相同名称的静态函数是不好的做法吗?

时间:2015-02-26 19:05:47

标签: c

请记住这是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! 
        }

}

1 个答案:

答案 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秒,如果它是可重入的,并且另一个线程也可以同时对另一个总线的数据运行相同的函数,则完全没有问题 - 这是线程提供的那种并发性。

请注意,我假设LongSearchAddressMaximumLongAddress是包含基本相同代码的两个文件中的静态变量。我已将它们翻译成我创建的struct BusDescriptor类型的引用,以捕获与两条总线之一相关的所有状态。我假设有一个非静态函数,可能是int SetBusDescriptor(struct BusDescriptor *bdp, const char *name) - 或者更可能是一个稍微复杂的接口 - 可用于设置每个总线的上下文。当创建每个“总线主控”线程时,它将被赋予自己的struct BusDescriptor指向它要管理的总线。当然,这两个调用将被赋予不同的总线进行管理。