关于C/C++头文件引起的编译问题

在 C++ 中,#include 是用于包含头文件的预处理指令。头文件是包含函数声明、类定义、常量等的文件,通常以 .h.hpp 作为文件扩展名。

#include 可以使用两种形式来包含头文件:

  1. 使用双引号 ("):

    cpp 复制代码
    #include "CESO.h"

    当使用双引号括起头文件名时,编译器会首先在当前源文件所在目录中查找该头文件。如果找不到,则会继续在其他包含路径中查找。

  2. 使用尖括号 (<>):

    cpp 复制代码
    #include <CESO.h>

    当使用尖括号括起头文件名时,编译器会在系统的标准头文件目录中查找该头文件。这些标准目录通常是在编译器安装时设置好的。

因此,双引号表示相对路径或自定义头文件的包含,而尖括号表示系统标准头文件的包含。

当你需要包含自己编写的头文件时,通常使用双引号形式。例如,如果 CESO.h 和当前源文件位于同一目录下,你可以使用 #include "CESO.h" 来包含该头文件。如果你需要包含系统提供的头文件,例如 <iostream><vector> 等,你应该使用尖括号形式,如 #include <iostream>

需要注意的是,使用尖括号形式时,编译器只会在系统标准头文件目录中查找头文件,而不会在当前源文件所在目录中查找。如果你的头文件不在系统标准目录中,而是在自定义目录中,你可以通过设置编译器的包含路径来告诉编译器在哪里查找头文件。


以上是一些关于引用头文件时,使用双引号和尖括号的区别。

在实际操作中,建议先把尖括号的引用放前面,双引号的头文件放最后,今天再编译时遇到一个问题,如果先把双引号的头文件放前面,会导致statistical_outlier_removal中一个函数ambiguous,很奇怪,只要把顺序调整一下就可以成功编译。

cpp 复制代码
#include <pcl/io/pcd_io.h>
#include <pcl/io/ply_io.h>
#include <pcl_conversions/pcl_conversions.h>
#include <pcl/PCLPointCloud2.h>
#include <pcl/filters/voxel_grid.h>
#include <pcl/filters/passthrough.h>
#include <pcl/filters/statistical_outlier_removal.h>
#include <pcl/common/transforms.h>
#include <pcl/filters/frustum_culling.h>

#include "CESO.h"
#include "generateMap.h"

...

报错如下:

复制代码
In file included from /usr/include/flann/algorithms/all_indices.h:35:0,
                 from /usr/include/flann/flann.hpp:45,
                 from /usr/include/pcl-1.8/pcl/kdtree/flann.h:50,
                 from /usr/include/pcl-1.8/pcl/kdtree/kdtree_flann.h:45,
                 from /usr/include/pcl-1.8/pcl/search/kdtree.h:44,
                 from /usr/include/pcl-1.8/pcl/search/pcl_search.h:44,
                 from /usr/include/pcl-1.8/pcl/filters/statistical_outlier_removal.h:44,
                 from /home/will/25omni_ws/src/gazebo_mobile_manipulator/src/find_closest_point/CESO_main.cpp:20:
/usr/include/flann/algorithms/nn_index.h: In member function 'int flann::NNIndex<Distance>::knnSearch(const flann::Matrix<typename Distance::ElementType>&, flann::Matrix<int>&, flann::Matrix<typename Distance::ResultType>&, size_t, const flann::SearchParams&) const':
/usr/include/flann/algorithms/nn_index.h:374:6: error: reference to 'flann' is ambiguous
      flann::Matrix<size_t> indices_(new size_t[indices.rows*indices.cols], indices.rows, indices.cols);

在自己写的两个头文件中添加的头文件如下:

  • CESO.h
cpp 复制代码
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
#include <opencv2/opencv.hpp>
#include <limits>
#include <iostream>
#include <math.h>
#include <ctime>
  • generateMap.h
cpp 复制代码
#include <iostream>
#include <opencv2/opencv.hpp>

有知道原因的大神,欢迎留言交流,感激不尽

相关推荐
River4162 小时前
Javer 学 c++(十三):引用篇
c++·后端
感哥5 小时前
C++ std::set
c++
侃侃_天下5 小时前
最终的信号类
开发语言·c++·算法
博笙困了5 小时前
AcWing学习——差分
c++·算法
青草地溪水旁6 小时前
设计模式(C++)详解—抽象工厂模式 (Abstract Factory)(2)
c++·设计模式·抽象工厂模式
青草地溪水旁6 小时前
设计模式(C++)详解—抽象工厂模式 (Abstract Factory)(1)
c++·设计模式·抽象工厂模式
感哥6 小时前
C++ std::vector
c++
zl_dfq6 小时前
C++ 之【C++11的简介】(可变参数模板、lambda表达式、function\bind包装器)
c++
每天回答3个问题6 小时前
UE5C++编译遇到MSB3073
开发语言·c++·ue5
凯子坚持 c6 小时前
精通 Redis list:使用 redis-plus-plus 的现代 C++ 实践深度解析
c++·redis·list