gpt4 book ai didi

c - 在不同的 C 模块中使用同名的静态函数是不好的做法吗?

转载 作者:太空宇宙 更新时间:2023-11-04 01:59:50 26 4
gpt4 key购买 nike

记住这是 C 代码,不是 C++...

...我有两个模块在做同样的事情,但在我的微处理器上的不同接口(interface)上。他们需要完全独立运行。

在两个文件中使用相同命名的静态函数集是不是不好的做法?也就是说,两个模块中几乎所有的函数都是静态函数,而且是静态函数的函数名完全一样。

我想我什至可以问,这是好的练习吗?

编辑:为了回应下面的争论,这里有一些[部分伪]代码:

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!
}

}

最佳答案

主要问题来自您的陈述:

I have two modules that are doing the same thing, but on different interfaces on my micro. They need to run completely independently.

从表面上看,您需要创建一批代码,这些代码可以配置为在任一特定接口(interface)上工作,这样您就有两批支持数据,但只有一份代码副本。

但是,如果有无法克服的原因导致这不可能(我很想知道它们是什么),那么在单独的模块中使用与静态函数相同的函数名称是允许的,并且可以正常工作。它可能会使代码搜索变得更加困难(对于每个关于重复代码的问题,你都会得到两个答案),并且你需要知道如何使用这些函数来使用你的调试器,但没有理由认为它是糟糕的。


问题现在有一些示例代码如下:

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) — 或者,更可能是一个稍微复杂一点的接口(interface) — 可以用来为每条总线设置上下文。当创建每个“总线主控”线程时,它会被赋予自己的 struct BusDescriptor 指向它要管理的总线。当然,这两个调用将被赋予不同的总线来管理。

关于c - 在不同的 C 模块中使用同名的静态函数是不好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28750709/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com