MyOS 发表于 2015-12-24 15:45:10

用C条件编译,如何判断某个函数是否存在?

如题,我想用条件编译判断某个函数是否存在,如果有这个函数就可以编译链接它;如果不存在,就跳过它。



lingdianhao 发表于 2015-12-24 15:59:46

试试弱连接 __weak ABC()
先用__weak 定义你的函数,函数体为空。
当你另外定义函数时,编译器会使用你定义的函数。若未定义,则使用__weak定义的函数,然而__weak定义的函数又为空。相当于你调用一个空函数,此时链接器是不会链接此空函数的。

again 发表于 2015-12-24 16:08:54

函数名是在编译后才有的,预编译怎么可能取得到,用WEAK关键字重载函数吧

again 发表于 2015-12-24 16:28:27

用extern __weak申明函数就行,编译器不会报错

MyOS 发表于 2015-12-24 16:53:23

lingdianhao 发表于 2015-12-24 15:59
试试弱连接 __weak ABC()
先用__weak 定义你的函数,函数体为空。
当你另外定义函数时,编译器会使用你定义 ...

谢谢你的帮助,根据你的建议,上网查资料,我是按照如下方法使用的,但是提示AppInit重复定义,编译不通过。
//------------------main.c-------------------------------------------
void __attribute__((weak)) AppInit (void);
void main(void)
{
AppInit ();
}
void __attribute__((weak)) AppInit (void)
{
}

//-----------------App.c--------------------------------------------------------------------------------

void AppInit (void)
{
.........
}

MyOS 发表于 2015-12-24 16:55:41

again 发表于 2015-12-24 16:28
用extern __weak申明函数就行,编译器不会报错

我用的CSS 6.1

zcllom 发表于 2015-12-24 17:01:52

貌似weak要写在函数的最前面

MyOS 发表于 2015-12-24 17:24:15

刚才换个编译器试了一下,这个用法和编译器有关系。

again 发表于 2015-12-25 11:11:51

试试
//------------------main.c-------------------------------------------
extern void AppInit(void) __attribute__((weak));
void main(void)
{
AppInit ();
}
页: [1]
查看完整版本: 用C条件编译,如何判断某个函数是否存在?