gcc、g++编译的那些事

时间:2021-10-30 09:14:56

严重声明:本帖绝非技术贴,只是在g++编译时遇到些百思不得其解的错误,而且这种错误应该很少人犯,写下来仅供你实在找不错出错地方时的“柳暗花明又一村”。

我在编译时总是提示“cprocessmodule.cpp中68行一个变量 'o_TypeName' 未声明”(注:cprocessmodule.cpp在src目录下,cprocessmodule.h在include目录下)我在cprocessmodule.h里查看了无数遍确定声明了此变量。这是个私有变量,难道...?不对啊,成员函数可以访问私有变量啊!那。。。我又想是否是上传到服务器时代码没有上传成功(未覆盖原版本代码),这个是很有可能的。

$ grep o_TypeName include/cprocessmodule.h
        string o_TypeName;
$

发现头文件也声明此变量了。然后我查了所有可能出错的地方(大小写、分号、大括号。。。)均没有问题,估计这个时候就该崩溃了。搞了我一上午啊。结果无意中我

$ vi src/cprocessmodule.h

大家发现什么问题了吗?src ,*.h ,奇怪的是竟然我还打开了文件,搜索 发现确实没有o_TypeName这个变量。正当我困惑时发现,我把目录名打成“src”,竟然还能打开文件。说明src目录下也有这个文件,查询了下发现一堆.cpp文件里藏了这个.h文件,最可恨的是这个还是老版本的.h文件,是没有声明此变量的。

这就好理解了。大家知道包含头文件时分两种形式,双尖头号<>,双引号。前者是在系统库里搜索头文件,后者一般是自己写的头文件。这样区分开的原因就是让编译器快速找到相应的头文件。编译器找头文件所在目录的先后顺序是:系统库目录-->源文件目录-->其他目录。我的源文件目录src里有一个头文件,include目录里有一个,调用时肯定是先调用本目录下的,因此就出现了这种状况。这都是本人不小心造成的恶果,写出来与大家分享,引以为戒。