linkage

#include <stdio.h>
                                                                                                    
static int i3 = 3;                                                                                  
int i3;                                                                                      

int main() {
}

会有编译错误么?
如果是

#include <stdio.h>
                                                                                                    
static int i3 = 3;                                                                                  
extern int i3;                                                                                

int main() {
}

会有编译错误么?
答案是前者会, 后者不会. 如果你答对了, 本篇就不用看了.

extern这个关键词到底是什么意思? 是不是表示, 这个symbol的定义不在这个源文件, 在另一个源文件? 好多博客都说, 如果你要用其它源文件的函数, 需要extern. 实际上对于函数不需要extern, 只有用外界的变量才需要external(实际上也不一定需要, 因为即使没有external, 也会被当做tentative definition).

其实它完全不是这个意思, 对于变量(而不是函数), 它用于表示, 这里previous linkage, 也就是说, 如果已经有过声明了, 那么linkage遵循之前有的, 否则是external linkage.

现来说为什么第一个会报错, static int i3 = 3; 就是定义, 同时指定了是internal linkage的. int i3;这是声明, 但声明出问题了, 因为none表示的是external linkage, 与static矛盾.

之所以第二个不报错, 是因为external如前面所说, 是previous linkage, 它听已经有的, 那就没有矛盾了.

posted @ 2020-12-09 15:28  Tokubara  阅读(317)  评论(0编辑  收藏  举报