首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在C++中使用两个名称来调用同一函数的首选方法

在C++中使用两个名称来调用同一函数的首选方法
EN

Stack Overflow用户
提问于 2012-04-03 04:52:21
回答 5查看 4.5K关注 0票数 19

我知道至少有三种流行的方法可以用多个名称调用同一个函数。实际上,我还没有听说过有人使用第四种方法来达到这个目的。

1)。可以使用#defines:

代码语言:javascript
复制
int my_function (int);


#define my_func my_function

代码语言:javascript
复制
#define my_func(int (a)) my_function(int (a))

2)。嵌入式函数调用是另一种可能:

代码语言:javascript
复制
int my_func(int a) {
    return my_function(a);
}

3)。在链接器中使用弱别名:

代码语言:javascript
复制
int my_func(int a) __attribute__((weak, alias("my_function")));

4)。函数指针:

代码语言:javascript
复制
int (* const my_func)(int) = my_function;

我需要多个名称的原因是因为数学库具有同一方法的多个实现。

例如,我需要一种有效的方法来计算标量浮点数的平方根。所以我可以只使用math.h的sqrt()。这效率不是很高。所以我写了一两个其他的方法,比如使用牛顿方法的方法。问题是每种技术在某些处理器(在我的例子中是微控制器)上都更好。所以我希望编译过程选择最好的方法。

我认为这意味着最好使用宏或弱别名,因为这些技术可以很容易地分组到头文件中的几个#ifdef语句中。这(相对)简化了维护。也可以使用函数指针,但它必须在源文件中,并在头文件中包含一般函数的外部声明。

你认为哪种方法更好?

编辑:

从提出的解决方案中,似乎有两个我没有解决的重要问题。

问:用户是否主要使用C/C++?

A.所有已知的开发都将使用C/C++或汇编语言。我正在设计这个库供我个人使用,主要是为了在裸机项目上工作。要么没有操作系统功能,要么操作系统功能最少。在成熟的操作系统中使用它的可能性很小,这需要考虑语言绑定。由于这是为了个人成长,因此学习流行的嵌入式操作系统上的库开发将是很有好处的。

问:用户是否需要/想要一个公开的库?

到目前为止,A.是这样认为的。因为只有我,所以我想在测试后对我使用的每个处理器进行直接修改。这就是测试套件有用的地方。因此,一个公开的库可能会有一些帮助。另外,特定功能的每个“最佳实现”可能有失败的条件。在这一点上,必须决定谁来解决这个问题:用户还是库设计者。用户需要一个公开的库来处理失败的情况。我既是“用户”,也是“库设计者”。考虑到这两种情况几乎是更好的。然后,非实时应用程序可以让库在出现时解决所有的稳定性问题,但实时应用程序将被授权考虑算法速度/空间与算法稳定性。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-04-03 05:00:55

根据您的库的目标受众,我建议您在两个选项中进行选择:

  1. 如果你的库的消费者被保证是C级的,那么使用#define sqrt newton_sqrt来获得最佳的可读性如果你的库的一些消费者是而不是C语言的(想想绑定到Dephi,.NET,无论什么),尽量避免消费者可见的#defines。这是绑定的一个主要缺点,因为宏在二进制文件中是不可见的-嵌入式函数调用是最具binding-friendly.

票数 7
EN

Stack Overflow用户

发布于 2012-04-03 06:27:13

另一种选择是将功能移动到单独编译的库中,该库针对每个不同的体系结构进行优化,然后在编译期间仅链接到该库。这将允许项目代码保持不变。

票数 7
EN

Stack Overflow用户

发布于 2012-04-03 05:15:32

你能做的就是这样。在头文件(.h)中:

代码语言:javascript
复制
 int function(void);

在源文件(.c)中:

代码语言:javascript
复制
static int function_implementation_a(void);
static int function_implementation_b(void);
static int function_implementation_c(void);

#if ARCH == ARCH_A
int function(void)
{
    return function_implementation_a(); 
}
#elif ARCH == ARCH_B
int function(void)
{
    return function_implementation_b();
}
#else
int function(void)
{
    return function_implementation_c();
}
#endif // ARCH

调用一次的静态函数通常由实现内联。以gcc为例,默认情况就是这样:即使在-O0中,-finline-functions-called-once也是启用的。未调用的静态函数通常也不会包含在最终的二进制文件中。

请注意,我没有将#if#else放在单个function主体中,因为我发现当#if指令位于函数体之外时,代码的可读性更好。

注这种方式在嵌入式代码中工作得更好,在嵌入式代码中,库通常以源代码形式分发。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9983648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档