2011-03-20 43 views
7

以下简化example.c文件做cc -std=c99 example.c如何在C99中正确内联和使用内联函数? (构建失败)

inline void a() 
{ 
} 

int main() 
{ 
    a(); 

    return 0; 
} 

打动了我:

在函数'主:
example.c :(文字+ 0x7的):未定义的参考 'A'
collect2:LD返回1个退出状态

据我了解这必须处理C99标准的要求,以便在每个内联非静态函数中都要求另外定义一个内联非静态函数,以便在内联体不能被内联的情况下使用?如果是这样的话,我猜想我可以用static inline来代替,但我不希望这会在以后咬我,所以这里最好采取什么行动?显然,我想坚持使用C99,并且我想要插入一些功能。 (是的,我知道编译器通常知道内联而没有被告知,但我有我的理由)

+0

“inline”关键字不是您认为的那样。对于编译器来说,这最好暗示这个代码可能成为内联的候选者。更糟的是,它被忽略了。 – jer 2011-03-20 16:50:02

+0

你可以通过你的cc编译其他文件吗?也许在编译器的问题。 – 2011-03-20 16:53:25

+0

其实我使用'-Winline',所以在我的情况下它不会被忽略。请原谅我没有具体说明这一点,但我并不认为有人会评论C语言中“内联”的含义或对此问题的反应。在上述的大多数其他变体中,你当然是绝对正确的。 @Mihran不,编译器没问题。在更详细地检查C99规格后,我已经将问题中的内联函数指定为“静态内联”,并且一切正常。我想知道如果我在这里采取了正确的步骤,虽然... – amn 2011-03-20 16:55:21

回答

0

没有函数原型,就是这样,所以函数签名被推断并推断错误。添加“void a();”到文件的顶部,并且你全都设置好了。

+0

是的,如果在同一单个翻译单元中定义了“a”(这是我给出的示例的情况),那么该方法就有效。只要我尝试'共享'这个内联函数,但是通过将它的定义放入自己的头部并包含来自两个或多个翻译单元的头部,它不起作用,我得到'多重定义'一个'错误。 。 是什么赋予了? – amn 2011-03-20 17:16:59

6

当你用-O2左右编译时,你可能没有那个错误。

内联函数定义应该在头文件和extern inline声明一个编译单元去。做

inline void a(void){ 
// empty 
} 

// in just one .c file 
#include "the-file.h" 
extern inline void a(void); 

BTW,宣告a没有void不是一个原型。

+0

好的,这很有趣。如果我需要“a”的定义以供多个翻译单元使用,我将如何继续? – amn 2011-03-20 17:19:39

+0

@amn,在头文件中只放入'inline' *定义*,并在其中一个翻译单元中放入'extern inline'声明。当心你确实需要一个C99编译器。较新的gcc例如可以。 – 2011-03-20 17:58:08

+0

@JensGustedt我会一直说这个,只要我找到声明这个的人,但源文件也必须包含定义。 – YoYoYonnY 2016-09-26 23:22:29