C 语言的 static extern 与 inline


C语言的编译一般是逐文件的,编译时不知道别的文件有没有定义什么符号。最后才链接到一起。

C语言又没有命名空间,所以有必要指示这个文件定义的东西别的文件能不能使用得到。

static

有两个用处。

给一个标识符(变量名,函数名)内部链接 (internal linkage)。也就是链接后别的文件看不到。(有点像 Java 的 private ,只不过针对的是文件) 在函数内,指示它是一个有静态生存期的变量,只在最初初始化,不在栈上。通俗地说,其实就是一个只允许某个函数看到的全局变量。如下:

int get_id() {
    static int x = 0;
    x += 10;
    return x;
}

int main(int argc, const char **argv) {
    printf("%d", get_id()); // 10
    printf("%d", get_id()); // 20
    printf("%d", get_id()); // 30
    return 0;
}

// ---------------- 和下面功能上是一样的,但上面的x别的地方不能访问。

int x = 0;
int get_id() {
    x += 10;
    return x;
}

int main(int argc, const char **argv) {
    printf("%d", get_id()); // 10
    printf("%d", get_id()); // 20
    printf("%d", get_id()); // 30
    return 0;
}

注意:常量全局变量是自动内部链接的

extern

只有一个用处,就是给予标识符外部链接(即别的文件看得到)。

也就是,你可以此处声明,另一个文件定义。

非常量全局标识是自动外部链接的。

inline

inline 现代的唯一用法是允许多重的相同定义(这样 include 多次就不会报 ODR 违规),和“内联”没有任何关系。