// lib.h
#pragma once
static inline int static_inline(int x) { return x; }
inline int extern_inline(int x) { return static_inline(x); }
// lib.c
#include "lib.h"
extern inline int extern_inline(int x);
// app.c
#include "lib.h"
编译 app.c 时,gcc 给出以下警告:
'static_inline' 是静态的,但用于非静态的内联函数 'extern_inline'。
为什么这是个问题?我的解释是:在 app.c 中,如果extern_inline
不是内联的,那么它就变成了一个函数调用,其实现细节(调用static_inline
)可以忽略。如果extern_inline
是内联的,那么它就有完整的定义,其他翻译单元中的定义也可以忽略。
C 标准明确禁止外部内联函数定义静态对象或调用其他内联非外部函数:
参考:C99 草案 WG14/N1256第 6.7.4 节第 3 点。
从技术上来说,这是否可行是另一个问题。它看起来确实可行,但由于标准禁止这样做,编译器可以假设这种情况不会发生,并生成和优化代码。