首页 > 解决方案 > 程序在我的 C++ 工作区中找不到头文件

问题描述

我对 C++ 编程非常陌生,并且一直在关注 C++ Primer 5th Edition 书。有一个练习需要作为头文件提供的对象“Sales_item”。链接已过期,所以我从 GitHub 获取代码并自己将其保存为头文件 (.h)。我正在使用 Code::Blocks IDE,并将 Sales_item.h 文件保存在与我的项目文件相同的目录中。当我重新打开项目时,CodeBlocks 自动在工作区中创建了一个“header”文件夹,其中包含 Sales_item 文件。我将它添加到我当前项目的顶部并编译,只是为了检查它是否有效:

#include <Sales_item.h>

但它会抛出一个错误并且不会编译。

程序的主体似乎并不重要。它实际上并没有做任何事情,只是用于测试,如果我从工作区中删除头文件,它可以编译并运行良好。我尝试在 Uni 的不同(希望更好)连接上从 GitHub 重新下载代码并重新保存文件,并将头文件移动到工作区 bin 和 obj 文件夹中的不同位置。错误消息可能暗示我没有使用 C++11?考虑到这是 2018 年的视频中推荐的 IDE,而且书中建议代码是 C++11,我的印象是。我不确定如何检查。我确定这是一个简单的问题,我只是不知道如何解决。编译时的错误消息包括 '#include ,并且还指向 Sales_item.h 文件本身,

#include <iostream>
#include <Sales_item.h>

using namespace std;

int main()
{
    int num1 = 2;
    int num2 = 3;

    std::cout << num1 + num2 << std::endl;

    return 0;

}

||=== Build: Debug in C++PrimerWork (compiler: GNU GCC Compiler) ===|
Documents\C++ Projects\C++Primer\C++PrimerWork\main.cpp|2|fatal error: Sales_item.h: No such file or directory|

Documents\C++ Projects\C++Primer\C++PrimerWork\Sales_item.h|56|warning: defaulted and deleted functions only available with -std=c++11 or -std=gnu++11|

Documents\C++ Projects\C++Primer\C++PrimerWork\Sales_item.h|70|warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11|

Documents\C++ Projects\C++Primer\C++PrimerWork\Sales_item.h|71|warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11|

Documents\C++ Projects\C++Primer\C++PrimerWork\Sales_item.h|45|error: constructor required before non-static data member for 'Sales_item::units_sold' has been parsed|

Documents\C++ Projects\C++Primer\C++PrimerWork\Sales_item.h|45|error: constructor required before non-static data member for 'Sales_item::revenue' has been parsed|
||=== Build failed: 3 error(s), 3 warning(s) (0 minute(s), 0 second(s)) ===|

第一个错误表明没有像 Sales_item.h 这样的文件,尽管它已自动添加到工作区并在其自己的选项卡中打开。进一步的错误也指向文件本身(特别是警告)。底部的两个错误让我认为原始下载在某种程度上已损坏。结合警告,我还想知道编译器是否期待不同版本的 C++,或者我做错了什么,但我不知道。

标签: c++headeridecodeblocks

解决方案


包含文件的两种变体不同之处在于编译器将在何处搜索要包含的头文件。

实际上,要包含的路径是在两个变体中定义的实现。但标准也规定:

[...]形式的预处理指令#include "q-char-sequence" new-line 如果搜索失败,则重新处理该指令,就好像它读取 #include <h-char-sequence> new-line[...]。

由此可见,您可以将任何标题包含在 中"",但不一定全部包含在 中<>

通常,“实现定义”的搜索路径包括标准库头文件的路径(例如cstdint, vector, ...)以及您显式提供给编译器的路径(通常通过-I命令行选项——但这取决于编译器),而""通常添加要编译的文件所在的目录(即相对于当前编译的文件的路径)。

这样,您可以包含如下路径:

#include "../include/myLibrary/SomeHeader.h"

如果将头文件和源文件放在不同的目录中,可能会发生这种情况。

相当普遍的约定(即标准不强制要求)是包括标准头文件和来自您链接的第三方库<>的那些 via 和您自己项目的那些 via ""


推荐阅读