C编译器编译代码生成的obj文件的符号表内,函数名称保持原样,比如int add(int,int)函数在符号表内就叫做add;C++编译器编译C++代码生成的obj文件符号表内,因为有overload的存在,函数名称的符号不再是原来的比如add,而是类似_Z3addii这样的。那么,一个C程序需要使用某个C++库内的add函数时,C程序这边期望的是add,但C++库内是_Z3addii,导致链接出错。同样,一个C++程序需要使用某个C库内的add函数,C++程序这边期望的是_Z3addii,但C库内是add这样的,同样不匹配,链接阶段也是报错。
extern "C"的意思,是让C++编译器(不是C编译器,而且是编译阶段,不是链接阶段)在编译C++代码时,为被extern “C”所修饰的函数在符号表中按C语言方式产生符号名(比如前面的add),而不是按C++那样的增加了参数类型和数目信息的名(_Z3addii)。
注意:加extern "C"并不是说编译器变了,编译器依旧是C++编译器,只不过编译生成符号名的时候按照C编译器的方式来
总之,是为了C++能兼容C,能调用C库