奇怪的未声明的变量编译器错误

时间:2017-08-20 23:30:30

标签: c++ compiler-errors

问题:编译器声明一个看似荒谬的错误,即类成员函数"中的局部变量未在此范围内声明"。下面显示的代码是原始函数的简化实现,并且它仍以某种方式触发相同的错误。此外,每当我重命名变量(在每个地方使用它)时,错误就会消失,并在我将变量更改回其原始名称后立即恢复("次要")。我不了解这种行为,无法找到有关导致编译器执行此操作的任何信息/帖子。有人可以提出可能出错的建议吗?它是否表示我的代码中的其他地方存在重大错误(例如Matrix类定义)?

详细信息:我正在使用CMake生成的Makefile上的g ++编译Linux Mint 18。我已尝试使用和不使用各种编译器选项(例如-O2,-Wall等),结果不变。我之前使用MinGW和自编写的Makefile在Windows 7上编译并运行了稍早版本的代码/项目,没有任何问题。我很乐意根据您的要求提供更多详细信息。

来自Matrix.cpp的修改/极简主义代码段:

Matrix Matrix::BuildCofactorMatrix() const {
    double minor (0.0);
    minor = 1.0;
    return Matrix(height_, width_);
}

警告讯息

  

/ PATH-TO-PROJECT-ROOT /src/Matrix.cpp:在成员函数'Matrix Matrix :: BuildCofactorMatrix()const'中:   /PATH-TO-PROJECT-ROOT/src/Matrix.cpp:1123:5:错误:未在此范围内声明'minor'        minor = 1.0;

2017-08-21编辑: 我删除了不必要的代码并创建了一个真正的"最小,完整,可验证的"问题的例子。对我来说,错误似乎是iostream库的一个功能。如果我删除iostream包含,问题似乎消失了。但是,错误还取决于用于编译的c ++标准。当我指定g ++使用时,例如-std = c ++ 11或-std = c ++ 14时,问题仍然存在,但是一旦我删除了规范(即g ++ -c Matrix.cpp),错误就会消失。顺便说一句,我使用的是g ++ 4:5.3.1-1ubu。

除非我遗漏了某些内容,否则我无法在iostream,istream,ostream或ios中找到任何提及术语" minor"的宏,但也许它可能是进一步扩大包含链......?

Matrix.hpp:

#ifndef MATRIX_HPP
#define MATRIX_HPP

class Matrix {
    public:
        void BuildCofactorMatrix() const;
};

#endif

Matrix.cpp:

#include "Matrix.hpp"
#include <iostream>

void Matrix::BuildCofactorMatrix() const {
    double minor (0.0);
    minor = 0.0;
}

1 个答案:

答案 0 :(得分:2)

我可以通过在函数之前添加#define minor(x) (x)来复制问题。

如果不使用&#34;参数&#34;宏匹配minor(0.0)但不匹配minor

该行

double minor (0.0);

将被

取代
double (0.0);

这是一个有效但无用的类型转换。

因此,请在其中一个包含文件中查找一些邪恶的宏。