都说c/c++坑多,今儿我碰到了一个小坑,但是无奈水平有限,这个小坑就干了我两个小时。首先说明的是,我学习c和c++是混着学的,没有仔细区分过。我估计大部分同学都是跟我一样吧。
今儿在Qt Creator里写了一个小项目,实现二叉堆。这个项目总共三个文件:heap.h heap.cpp 和main.c
注意我这三个文件的后缀名,在这样情况下我就编译了一下。oh my god!!编译时候连接错误!undefined reference to ***
这些函数都是我在heap.h里定义的,也在heap.cpp里实现了的。我在main.c里也include “heap.h"。也是就google了两个小时~~~无解。
不过我大致把问题定位在使用gcc编译还是用g++编译这个问题上。好了不卖关子了。
我的main.c是c后缀,所以Qt Creator默认调用gcc编译,gcc将工程中所有文件干C文件对待,所以就不会有我heap.cpp中实现的函数了,故undefined reference。
那么好,把main.c 后缀改为main.cpp重新编译,cheers编译通过。google上说,遇见cpp,GNU/gcc会调用g++去编译。
虽然问题解决了,但是好奇心驱使我将工程文件全部改为c,那么现在我的三个文件就是:heap.h heap.c main.c
这时显然是用的gcc编译的,也就是说用的c编译器而不是c++编译器。不过这次我的程序有问题了:
这个swap_values函数我经常用,在c++里肯定是没问题的。唯一的原因是c语言不支持引用类型的参数。google了一下果然如此。
在c语言里,swap_values这种交换参数变量的函数只能接受指针。
玩了,路漫漫~~~~