我是 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";
}
header ,如 bob.h
,包含基本上是接口(interface)定义的内容(尽管它们也可能包含实现 - 这是另一个讨论)。声明
#include "bob.h"
告诉编译器,在编译期间,它应该打开 bob.h
,直接粘贴该文件的内容来代替 #include
指令,然后编译.cpp
就像您自己将 header 的内容放在 cpp 中一样。
如果您正在尝试自学这些东西,恭喜您并坚持下去!
如果这是家庭作业,我建议您去办公时间,拿起一 block 白板,不断地向老师提问,直到弄清楚为止。使这些内容尽可能清晰易懂是教师的工作。 (我教书 - 让事情变得清晰并不总是那么容易,我欢迎学生提出问题。最终,我希望我所有的学生都能理解并热爱他们所做的事情。)
关于c++ - 使用两个 cpp 文件时使用未声明的标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26018144/