【问题标题】:How to have a header file without a cpp one?如何有一个没有 cpp 的头文件?
【发布时间】:2016-04-30 18:14:04
【问题描述】:

我的头文件包括:

#define PAUSE system("pause");
typedef unsigned char uint8;
static const double PI = 3.14159265358979323846;
static const double oneDegInRads = PI / 180;

我一直在将这个头文件包含在很多 .cpp 文件中,而且没有任何问题。当我想清理我的代码时,我正在修复警告,主要是一些次要的东西,比如“将双精度转换为浮点,可能丢失数据”或“无符号到有符号不匹配”警告。所以我在设置中打开了“将编译器警告视为错误”,这样我就可以严格评估我的代码有多糟糕并相应地修复它。打开它后,我的解决方案将无法构建,并显示错误:

Code                         Description                                  File   
C2220     "Warning treated as error - no 'object' file generated     myDefinitions.h

我知道为什么会发生这种情况,因为我打开了该特定设置。我已尝试通过以下方式抑制和禁用此警告:

#pragma warning (disable : 2220)

我还尝试遵循“每个标头规则一个 CPP”,制作“myDefinitions.cpp”并仅包括标头而不包括其他内容,但错误消息仍然出现。

所以我的问题是:

1:我可以有一个没有 .cpp 的头文件(不忽略警告)吗?

2:如果没有,我如何制作我的 .cpp,因为我已经尝试过但失败了?

3:您有什么更好的解决方案可以让您在一个页面中包含您经常使用的所有重要定义?我需要让它们可以包含在任何你想要的地方。

【问题讨论】:

    标签: c++ header include compiler-warnings definition


    【解决方案1】:

    Visual Studio 正在尝试将您的 myDefinitions.h 头文件编译为目标文件。

    它不应该那样做!只有 .cpp 源文件应该被翻译成目标文件。

    我猜您可能在某个时候将 .cpp 文件重命名为 myDefinitions.h,而 Visual Studio 不明白您想要更改其文件“类型”。

    尝试删除您的 myDefinitions.h 文件,然后创建一个新的 myDefinitions.h 文件,从新文件对话框中选择正确的文件类型。然后,您可以将旧内容放入新标头中。

    【讨论】:

    • 哇,这确实做了一些事情,因为现在我没有得到大约 5 个这样的错误,我只得到一个,而且它不是 myDefinitions 文件,这可能是另一个问题。有趣的。让我在解决这个问题时回复你。
    • 天哪,伙计,做到了。我所做的所有这些阅读都让人们说你必须有一个 cpp,这很奇怪。所以我完全删除了标题,创建了一个新标题,错误就消失了。你介意解释一下为什么会这样吗?编辑:没关系,您的原始答案解释了它。我只是想知道我到底做了什么。非常感谢。
    • 其实不是这样的。它显示错误的原因是在我的 myDefinitions.h 中存在隐式类型转换,例如:'initializing': truncation from 'double' to 'float' 不过你的回答让我找到了正确的解决方案,所以谢谢。
    【解决方案2】:

    好的,感谢 Ton Plooij 和 Johan Boule。发生这种情况的原因是在我的头文件中存在隐式类型转换,例如:

    C4305: 'initializing': truncation from 'double' to 'float'
    

    在错误选项卡中它只说:

    "Warning treated as error - no 'object' file generated
    

    这让我相信它正在寻找一个 CPP 文件,这很奇怪,因为头文件没有被制作成目标文件。我不知道的是,我可以通过单击“警告”选项卡找到触发“错误”消息的“警告”。它准确地显示了哪些“警告”导致“错误”出现。

    再次感谢您的帮助。

    【讨论】:

    • 哇,所以 Visual Studio 在这里给出了一个相当令人困惑的消息:“没有生成'对象'文件”然后是“myDefinitions.h”.. 这真的让人认为它正在尝试编译 myDefinitions.obj文件。现在我明白该消息仅意味着它在遇到警告的时候退出,因为警告被视为错误,因此甚至不会打扰目标文件的创建。唷。
    【解决方案3】:

    出现 C2220 错误是因为有警告。由于存在警告,因此不会生成任何对象或可执行文件。您不能禁用此 C2220,它是您使用 /WX 选项启用的。因此,要么修复所有警告,要么禁用 /WX(将所有警告视为错误)选项。

    【讨论】:

    • 其实你是对的。它在“错误”选项卡中显示错误的原因是因为在 myDefinitions.h 中有关于隐式类型转换的警告,例如 C4305: 'initializing': truncation from 'double' to 'float'。虽然我不知道我可以通过单击“警告”选项卡找到哪个特定错误。赞成。尽管我认为您可以禁用或禁止这些警告,但与您所说的不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    • 1970-01-01
    • 2012-11-18
    相关资源
    最近更新 更多