C 如果找到,请使用系统实现,否则请使用我自己的实现
我正在尝试在我的例行程序中使用C 如果找到,请使用系统实现,否则请使用我自己的实现,c,C,我正在尝试在我的例行程序中使用fls。然而,并非每个系统都具有此功能。因此,我提供了自己版本的fls。我想知道是否有任何方法可以让程序使用系统实现而不使用我自己的实现 #include "strings.h" #include <stdio.h> int fls(int mask); int foo(int N) { int tmp = 1 << (fls(N)); return tmp; } /* * Find Last Set bit */ int
fls
。然而,并非每个系统都具有此功能。因此,我提供了自己版本的fls
。我想知道是否有任何方法可以让程序使用系统实现而不使用我自己的实现
#include "strings.h"
#include <stdio.h>
int fls(int mask);
int foo(int N)
{
int tmp = 1 << (fls(N));
return tmp;
}
/*
* Find Last Set bit
*/
int
fls(int mask)
{
int bit;
if (mask == 0)
return (0);
for (bit = 1; mask != 1; bit++)
mask = (unsigned int) mask >> 1;
return (bit);
}
#包括“strings.h”
#包括
int-fls(int-mask);
int foo(int N)
{
int tmp=1>1;
返回(位);
}
您可以使用弱函数
默认情况下,在没有任何注释的情况下,对象文件中的符号是
坚强的在链接过程中,强符号可以替代的弱符号
同名
C++中的相同问题,与C实现< /P>略有不同
因此,如果system
fls
定义为strong,您的fls
实现将被覆盖。您是否要求#ifndef fls“您的fls在此处声明”#endif
预处理器条件?(当然,在单独的行中)最常见的方法可能是不在C中执行此操作,而是使用其他工具检查fls
是否可用,并向您的程序指出这一点,通常通过宏定义,有时通过过滤要编译的源文件。autoconf是可以做到这一点的工具之一,还有很多其他工具。这是否适用于您取决于您的构建系统和受支持的系统。你能提供一些细节吗?@DavidC.Rankin不确定。这是这种情况下的最佳实践吗?@hvd我认为应该有多种方法来实现。然而,我想知道在这种情况下什么是最佳实践。我没有特别的构建系统,但是有一个makefile
。你确定\uuuuu attribute\uuuu((弱))
是可移植的吗?我找不到关于可移植性的信息,但它列在gcc.gnu文档的“common function attributes”下:这正是我的意思:它是一个gcc扩展,其他编译器确实存在。谢谢你回答我的问题。此解决方案是否等同于问题注释中提到的#ifndef
解决方案?谢谢不,它定义函数,但如果有一个文件具有相同函数的强定义(普通定义),编译器将使用该文件代替弱定义
int __attribute__((weak)) fls(int mask){ .. }