【问题标题】:Trace the steps the compiler took that resulted in the error跟踪编译器采取的导致错误的步骤
【发布时间】:2011-09-16 15:06:38
【问题描述】:

我偶尔会遇到两个问题。一个是编译时断言,另一个是以奇怪的方式包含在多个位置的头文件(这不是我的代码,所以我不能修复它不以奇怪的方式包含它。即使我尝试过, 因为它是深深嵌入的,所以需要花费太多小时/天),例如:

class Foo
{
public:
#include "VariableDeclarations.h" // Some file that has all the variables that need to be declared
                                       // which is also included by several other classes in the same way
};

上面的代码是我目前正在处理的简化。当然,类 Foo 也在做其他事情。

现在,如果我在这种情况下在头文件中添加另一个变量声明,并且文件Class Foo 所在的文件不知道类型,我会得到一个编译错误。为了解决这个问题,我包含了必要的标题。问题是,编译器告诉我的只是“未声明的标识符”,文件名显示为VariableDeclarations.h。我想知道哪个文件包含声明,因此不知道我刚刚添加的类型。

编译时断言也会发生类似的情况。我不知道是哪一行/文件导致了错误。它只是给了我错误(例如,在 Eigen 数学库中,我经常遇到这种情况)。

【问题讨论】:

  • 为什么不直接从包含变量的类继承?
  • @DeadMG:就像我说的那样,该代码不是我编写的,并且标头正在其他地方使用并用于各种不同的宏,即嵌入太深。如果我没有在标题中包含类型,那么在其他地方使用标题的类不知道类型。我可以将声明放在每个必须了解它的类中,但这可能就是首先使用它的原因,以使过程自动化。假设我无法更改代码(我给出了一个非常简化的版本,说明实际发生了什么以及为什么它们包含这样的标题)

标签: c++ compiler-errors


【解决方案1】:

在 g++ 中,您可以使用详细选项 -v。对于英特尔,相同的标志 -v 应该可以工作。对于 MSVC,您可以在其中一个构建设置中的某处进行调整:How can I make Visual Studio's build be very verbose?

【讨论】:

  • 好吧,我试了一下。花费的时间太长或 Visual Studio 停止响应。所以我对一个源文件进行了尝试(尽管在这种情况下这违背了目的,我只是想知道导致错误的原因而不是产生错误的原因)并且 Visual Studio 吐出的文件绝对是一场噩梦通过。必须有更好的方法,编译时断言是基于模板的库的规范。
【解决方案2】:

预处理器井号 (#) 必须是要处理的行上的 第一个 符号,并且尾随的 ; 也不应该在那里:

class Foo
{
public:
#    include "VariableDeclarations.h"; // Some file that has all the variables that need to be declared
                                       // which is also included by several other classes in the same way
};

此外,GCC 和 MSVC 都有一个开关,可以只运行预处理器并向您显示生成的文件。这是调试这类东西的绝佳工具。

【讨论】:

  • 不知道# 是第一个符号,而分号是我的错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-26
相关资源
最近更新 更多