c++ - c++中的包含编译模型

标签 c++ include

/*--------------------utilities.h-------------------------------------*/

#ifndef UTILITIES_H
#define UTILITIES_H

template<class T> int compare(const T&,const T&);

#include<utilities.cpp>
#endif

/*--------------------utilities.cpp-------------------------------------*/

template<class T> int compare(const T &v1 , const T &v2)
{
    if (v1 < v2) return -1;
    if (v2 < v1) return 1;
    return 0;
}

/*--------------------main.cpp------------------------------------------*/

#include<iostream>
#include<utilities.h>
using namespace std;

int main(int argc , char *argv[])
{
    cout << compare(1,2) << endl;

    return 0;
}

上面的代码是书中的一个例子。但是,当我编译这三个文件时它会出错:

utilities.h:6:24: fatal error: utilities.cpp: No such file or directory
compilation terminated.
main.cpp:2:22: fatal error: utilities.h: No such file or directory
compilation terminated.

我不知道为什么我得到“没有这样的文件或目录”!

最佳答案

问题1

当你写的时候:

#include <utilities.h>

编译器在默认包含路径或明确指定的路径中查找 utilities.h(例如,在带有 -I 的 g++ 中)。

你可以这样写:

#include "utilities.h"

让它首先查看相对于源文件的路径。

问题2

您在头文件中包含了 utilities.cpp(也存在与上述相同的问题)。不推荐这样做,但严格来说也不是错误的。然而,在那种情况下,该文件的内容已经编译并包含在 main.o 中,因此您实际上不需要编译和链接这两个目标文件,而只需 main.cpp 就够了。

编写模板的推荐方法是将所有内容都写在头文件中(我知道,这并不好):

/*--------------------utilities.h-------------------------------------*/

#ifndef UTILITIES_H
#define UTILITIES_H

template<class T>
static inline int compare(const T &v1, const T &v2);
{
    if (v1 < v2) return -1;
    if (v2 < v1) return 1;
    return 0;
}

#endif

/*--------------------main.cpp------------------------------------------*/

#include <iostream>
#include "utilities.h"

using namespace std;

int main(int argc , char *argv[])
{
    cout << compare(1,2) << endl;

    return 0;
}

您只需编译 main.cpp

关于c++ - c++中的包含编译模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12278266/

相关文章:

c++ - 如何为模板参数包指定默认参数?

c++ - [错误]请求的 'area'中属于非类类型 'r'的 'float'成员意味着什么?

c++ - 如何消除 GCC 中的外部库/第三方警告

C - 我应该使用引号还是括号将标题包含在单独的目录中

PHP - 查找包含当前文档的脚本的 URL

c++ - 使用 C++ 编译器包含 C 头文件时的警告

c++ - 检查扑克牌的大牌和对子

c++ - 如何使用 OpenCV 和 C++ 通过限制矩形大小来过滤轮廓?

c++ - 项目 "Additional include directory"被忽略

c++ - 以编程方式在 QTreeView 中选择一行