extern 的使用介绍

今天去笔试ucweb,遇到一道关于extern的题目,我觉得有点意思,特研究了一番!

问题如下:

有如下两个文件a,c,b.cpp,内容如下:

文件:a.c

f1(){printf("hello")}

文件b.cpp

extern f1();

 

int main()

{

     f1();

    return 0;

}

 

gcc -c a.c -o a.o

gcc -c b.cpp -o b.o

gcc a.o b.o -o a.exe

在执行第三句编译的的时候发生错误:

b.cpp:(.text+0x12): undefined reference to `f1()'
collect2: ld ·µ»Ø 1
问题:出现错误的原因,和解决办法

 

出现问题的原因是,gcc中对.c和.cpp文件是区别对待的,.c文件默认按照c语言的编译方式来编译,而.cpp默认是按照C++的编译规则来进行的.在a.c中f1()函数编译后可能成为__f1xxxx(),,而在C++中因为函数可以重载所以编译后f1()函数可能变成func1@@YAXXZ

所以编译后同一个函数的形式是不一样的.所以在C++中调用C函数必须显示的申明一下.

解决办法:

1.使用mv b.cpp b.c,然后编译

2. 将b.cpp中的 extern f1();改成 extern "C" { void f1();}

然后先使用gcc编译a.c然后再使用g++编译b.cpp,最后使用g++链接a.o b.o生成a.exe

 

你可能感兴趣的:(c,gcc,语言,reference,UCWeb)