看,活了这么久,依然可以当小白。
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 的方言,但是这并不推荐。
不过如果写了个单独static会更好(或者带递归啥的)的static inline的话, 应该也会变成不展开的普通static吧…
各位Clang大触能不能看看Darling这个project到底能不能用啊?
@.txt darling 和 clang 有直接关系吗 – – 我也没mac试它干啥……
@csslayer
darling 依赖clang, daring就是用linux上弄个兼容层模拟运行Mac软件, 原理类似wine……
= = 我可不可以说 `inline` 之前那个空格看着实在不爽…………………….
你要是再写一个 f() 的定义出来呢?