【问题标题】:compiler error on including a custom made header file包含自定义头文件时的编译器错误
【发布时间】:2014-05-26 02:04:46
【问题描述】:

晚上好,

你们中的一些人可能会认为这是一个愚蠢的问题。但是我已经开始学习 C++,一切都很顺利,直到我遇到了这个困扰我好几天的错误。到目前为止,我已经对网络进行了一些研究并修复了所有问题。

问题是,当我尝试包含我制作的新头文件时,编译器无法识别该文件的内容。我正在使用 Dev-C++ 编译器。

当我尝试编译时出现以下错误:main.cpp line 8 error: `test123' undeclared (first use this function)

我有一个名为 001 的文件夹,其中还有另一个名为 src 的文件夹(我在其中存储我的 .h 文件),以及 main.cpp 和 new.cpp 。

这是main.cpp的代码:

#include <iostream>
#include "src/functions.h"

using namespace std;

int main(){
    test123(5,'Test String');

    //close on enter keystroke
    cin.clear();
    cin.ignore(255,'\n');
    cin.get();
    return 0;
}

这是functions.h中的代码:

#ifndef FUNCTIONS_H_INCLUDED
#define FUNCTIONS_H_INCLUDED

    string test123(int i,string inputStr);

#endif

这是functions.cpp中的代码:

#include "src/functions.h"

string test123(int n, inputStr){
    for(int i=0;i<=n;i++){
        cout << "\n\t"+inputStr <<endl;
    }
}

【问题讨论】:

  • 我得到一个错误:`test123' undeclared (首先使用这个函数)
  • 那是你的真实代码吗?我看不出functions.cpp是如何编译的。

标签: c++ dev-c++


【解决方案1】:
  1. 在标头中,变量必须声明为extern,然后在.cpp文件中定义。
  2. functions.h没有#include &lt;string&gt;提供函数test123的返回类型
  3. .cpp文件没有#include &lt;iostream&gt;提供cout
  4. 您在functions.cpp 中没有test123 定义的inputStr 参数类型。

    #ifndef FUNCTIONS_H_INCLUDED
    #define FUNCTIONS_H_INCLUDED
    
    #include <string>
    
    extern int testVar;
    std::string test123(int i, std::string inputStr);
    
    #endif
    

    对于 .cpp:

    #include <iostream>
    #include "src/functions.h"
    
    using namespace std;
    
    int testVar = 123456;
    
    string test123(int n, string inputStr){
        for(int i=0;i<=n;i++){
            cout << "\n\t"+inputStr <<endl;
        }
    }
    

【讨论】:

  • 我删除了变量,添加了 '#include ' 和 'using namespace std;'但我继续收到错误。
  • 我不推荐using namespace std;,当然也不要在头文件中使用。
  • @FredLarson 我不想更改来源。确实,最好修复它。
  • @user3111896 源中的错误太多,现在看起来已修复。
  • 好的,首先很抱歉打扰您,但我一直遇到问题。我已将 main.cpp 中的第 8 行更改为 //test123(5,'Test String'); .现在它只剩下 testVar 了,当我尝试编译时出现此错误: [Linker error] undefined reference to `testVar' 。我已经把书的章节重读了好几遍,看看我是否发现任何错误,但一切似乎都很好。
【解决方案2】:

functions.cpp 不包含test123 返回的string 类型的定义; test123 的第二个参数没有任何类型。这不可能编译。编译器可能会丢弃 test123 的完全搞砸的定义,因此稍后会感到困惑抱怨。但问题是声明不正确,如果编译器之前没有大声抱怨,我会感到非常惊讶。

如果你想在这里澄清一下,值得称赞的是,尝试将问题简化为尽可能小的程序来显示问题,没有人会通过数百个他们真的不关心的程序的不相关行来寻找乐趣关于。但请确保结果确实编译,或几乎编译,并且确实显示了您想要建议的确切问题。确保所有让你感到困惑的编译器消息是唯一的。

【讨论】:

  • @user3111896,通过随机更改“修复”程序不会让你走得太远,这就是我要说的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多