看,活了这么久,依然可以当小白。
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 的方言,但是这并不推荐。