使用两个cpp文件时使用未声明的标识符

Use of Undeclared Identifier when Using two cpp files

本文关键字:未声明 标识符 文件 两个 cpp      更新时间:2023-10-16

我是c++的新手,所以我仍然不清楚如何将文件链接在一起等等。我正在做一个练习,其中我有一个测试文件bob_test.cpp,其开头如下:

#include "bob.h"
#define BOOST_TEST_MAIN
#include <boost/test/unit_test.hpp>
BOOST_AUTO_TEST_CASE(stating_something)
{
    BOOST_REQUIRE_EQUAL("Whatever.", bob::hey("Tom-ay-to, tom-aaaah-to."));
}

在练习中,由我来编写"bob.cpp",所以我的问题是,我如何编写它,以便测试文件能够识别它?目前,我在倒数第二行得到一个"使用未声明的标识符'bob'"。我使用的是Xcode,我有一个bob.cpp和bob.h,几乎是空的。

谢谢。

当您看到类似的东西时

bob::hey("Tom-ay-to, tom-aaaah-to.")

bob必须是在bob.h中声明的命名空间或类。该文件可以被称为任何东西——它不必与作用域解析运算符::左侧的内容相匹配。

你必须在其他地方(可能在bob.h中)有这样的东西:

class bob
{
public:
    static std::string hey(const std::string &s);
}

或者,可能性稍小的

namespace bob
{
   std::string hey(const std::string &s);
}

这包含在bob_test.cpp(由您的#include "bob.h")预处理器指令中。

/// bob.cpp
#include "bob.h"
#include <string>
std::string bob::hey(const std::string &s)
{
   return "asdfasdfasdf";
}

标头,如bob.h,包含基本上是接口定义的内容(尽管它们也可能包含实现——这是另一个讨论)。声明

#include "bob.h"

告诉编译器,在编译过程中,它应该打开bob.h,直接粘贴该文件的内容来代替#include指令,然后编译.cpp,就像您自己将头的内容放在cpp中一样。

如果你想把这些东西教给自己,祝贺并坚持下去!

如果这是家庭作业,我建议你在上班时间拿一块白板,向老师提问,直到问题清楚为止。教员的工作就是让这些内容尽可能清晰易懂。(我教书——让事情变得清楚并不总是容易的,我欢迎学生们提出问题。最终,我希望我的所有学生都能理解并热爱他们所做的事情。)