Clang 的 inline

看,活了这么久,依然可以当小白。

Clang 的 inline 是怎么回事呢?

先来段代码:

 inline void f()
{
}

int main()
{
    f();
    return 0;
}

然后

$ clang main.c 
/tmp/main-hn0696.o: In function `main':
main.c:(.text+0x12): undefined reference to `f'
clang: error: linker command failed with exit code 1 (use -v to see invocation)

WTF?这不科学!

好吧,我们来学习下clang 的inline 的behavior,换句话说,C99的。(http://clang.llvm.org/compatibility.html#inline

static inline:永远展开代码

inline:在编译器觉得应该展开的时候展开,例如在debug的时候,不展开。

所以你会发现

$ clang main.c -O2

是没问题的。因为此时 f() 被当作 inline 展开了所以并不需要解析 f 的符号。

结论:

写static inline,或者就不inline。或者让 clang 用 gnu89 的方言,但是这并不推荐。

This entry was posted in Linux. Bookmark the permalink.

6 Responses to Clang 的 inline

  1. yyc says:
    Chromium 23.0.1271.64 Arch Linux x64

    不过如果写了个单独static会更好(或者带递归啥的)的static inline的话, 应该也会变成不展开的普通static吧…

  2. .txt says:
    Google Chrome 24.0.1312.35 Arch Linux

    各位Clang大触能不能看看Darling这个project到底能不能用啊?

  3. csslayer says:
    Firefox 17.0 GNU/Linux x64

    @.txt darling 和 clang 有直接关系吗 – – 我也没mac试它干啥……

  4. .txt says:
    Google Chrome 24.0.1312.35 Arch Linux

    @csslayer
    darling 依赖clang, daring就是用linux上弄个兼容层模拟运行Mac软件, 原理类似wine……

  5. yyc says:
    Chromium 23.0.1271.64 Arch Linux x64

    = = 我可不可以说 `inline` 之前那个空格看着实在不爽…………………….

  6. endle says:
    Firefox 20.0 GNU/Linux x64

    你要是再写一个 f() 的定义出来呢?

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.