【问题标题】:C++ Header #define compiler errorC++ Header #define 编译器错误
【发布时间】:2014-03-06 09:13:25
【问题描述】:

我正在学习 C++,但我的水平还很低。 - 我目前正在研究使用头文件,我有一个两部分的问题。

第 1 部分

据我所知,头文件定义类似于 VB.net 中的硬编码字符串?例如,我可以执行以下#define STOCK_QUANTITY 300,然后在函数中使用它时引用我的定义?我认为这与 VB.net 字符串的工作方式相同,因为如果我需要更改定义并且我的程序在几百个不同的行上引用数字 300,我只需要在一个地方更改值?

第 2 部分

现在,正如我所说,我还在学习,所以我还在做你们旧的乘法任务。我擅长将函数与我的主 .cpp 文件一起使用,但我不会继续使用头文件。到目前为止,这是我的代码 sn-p。

add.h

#ifndef ADD_H
#define ADD_H

int add(int x, int y);

#endif 

ma​​in.cpp

#include "stdafx.h"
#include <iostream>
#include "add.h"

int main()
{
    using namespace std;
    cout << add(3, 4) << endl;
    return 0;
}

当尝试运行它时,我收到 2 个构建错误,它不会编译。

抱歉,这些都是愚蠢的问题,但我希望能提供见解、提示,甚至是我应该考虑的其他一些事情。谢谢。

编辑

根据答案,我也更改了 add.h

#ifndef ADD_H
#define ADD_H

int add(int x, int y)
{
    return x + y;
}

#endif

当我阅读答案时,我意识到我什至没有告诉函数该做什么:( - 天哪。

【问题讨论】:

  • ObSocraticMethod: 你希望你的程序做什么?返回数字相加的结果?它怎么知道这样做?就因为你调用了函数add?
  • 查看我的编辑,我意识到我没有真正定义函数的错误。 叹息
  • 我实际上不知道 VB.NET 硬编码字符串到底是什么,但在 C++ 中,理解宏(即#defined 值)的最佳方式是它们只是替换为的标记它们的价值(如自动复制粘贴系统)。
  • 是的,这就是我对它们的理解,在 VB.net 中就是这样接受你在项目设置中定义的。

标签: c++ visual-c++ header-files build-error


【解决方案1】:

你还没有为函数add添加函数体

int add(int x, int y)
{
    // add stuff here
}

这可以在头文件中完成,也可以在单独的 cpp 文件中完成。您正在尝试调用没有代码的函数。这称为函数原型。

【讨论】:

  • 我想我需要添加 return x + y;然后在函数体中或我希望它在控制台中打印的任何内容中?
  • @SamuelNicholson 确实 :)
【解决方案2】:

您只声明了函数add 存在,这就是您可以调用它的原因。但您实际上并没有在任何地方定义函数。

在 C++ 中,声明定义必须有所不同。有时这些是同时完成的,例如在声明局部变量时。其他时候你将它们分开,比如在头文件中有一个函数原型(就像你做的那样),那就是声明。函数的定义就是函数的实现。


编辑后,您现在遇到了另一个问题。也就是说,如果您将头文件包含在多个源文件中,则每个源文件(正式称为翻译单元)都将定义函数,因此您会收到错误。

可以通过函数staticinline来解决。或者更好的是,创建一个新的源文件(如 add.cpp),在其中定义 add 函数,并在头文件中只保留声明(原型)。

【讨论】:

  • 查看我的编辑,我刚刚补充说,在我意识到我犯的愚蠢错误之后:0
  • @SamuelNicholson 该编辑可能会导致其他问题。更新了我的答案以包含它们。
  • 也可以通过添加.cpp文件并将函数放入其中来解决
  • @JoachimPileborg 我实际上并没有在我的学习中做到那么远,我现在只是想学习如何使用多个文件并将所有内容相互链接,但我理解你提出的观点但不是然而如何解决它。感谢您的帮助。
【解决方案3】:

至于您问题的第 1 部分: 虽然#defines 按照您的描述进行,但使用它们有一些缺点(例如,它们由预处理器解析,而不是由编译器解析,因此没有类型检查,如果您稍微复杂一些,您可能会遇到时髦的错误宏。 因此,虽然您的语句是有效的,因为它定义了一个全局常量,您只需要在一个地方修改它,并且可以在多个地方使用,为此,最好在头文件中有一个实际的常量变量: 例如

const int STOCK_QUANTITY = 300;

现在你明确地将它命名为一个整数,编译器也可以执行额外的检查。

另请参阅 Scott Meyer 撰写的 Effective C++ 中的第 3 条(我认为,如果您认真考虑使用 c++ 进行持续编程,那么这是必读的,尽管在阅读之前您需要一些经验。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 2016-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多