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

标签 c++

我是 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/

相关文章:

c++ - 在结构中制作某个结构的数组。

c++ - cpp 二进制数据可移植性

c++ - 从 C 库调用 C++ 函数指针

C++ Windows HTTP

c++ - Visual Studio 2010 C++,无法打开包含文件 : 'afxwin.h' , 'TCHAR.H' 和 'cassert'

C++测试与菜单应用

c++ - 为什么或在什么情况下,您会在 C++ 中将参数作为引用(或指针)传递给函数?

c++ - 是否有可能从基类函数 "inherit"派生函数?

c++ - 最小对数

c++ - 我可以将VB代码转换为C++代码吗