c ++外部可见const

时间:2016-02-19 16:02:21

标签: c++

我有一个函数,在成功时返回零,或者检测到错误的行号:

int func() {
    // stuff
    if (something is wrong) {
        return __LINE__;
    }
    // more stuff
    if (something else is wrong) {
        return __LINE__;
    }
    // all good
    return 0;
}

真正的来电者只检查返回值是否为零,通常是这样的:

int ret = func();
if (ret != 0) {
    return ret;
}

但是,在测试期间,我想检查实际的返回值,以验证是否触发了某个失败条件:

int ret = func();
EXPECT_EQ(42, ret);

这会产生一个问题,因为当编辑func()的源文件时,return语句的行以及返回的值也会发生变化。我希望func()的调用者可以使用行号值。

可以像这样“导出”行号:

// header
extern const int line_number;

// source
const int line_number = __LINE__;

不幸的是,这仅适用于函数外的行号。我想要这样的东西:

if (something is wrong) {
    const int line_number = __LINE__; return __LINE__;
    // or some other const thing
}

可以从另一个翻译单元(文件)中读取。

我尝试了static const int line = __LINE__,但这有两个缺陷:

  • 这不是标题中声明的line_number的定义。
  • 在执行过程之前可能无法设置。

1 个答案:

答案 0 :(得分:0)

这是一个如何轻松解决这个问题的例子:

struct FuncErrorCodes {
    enum Type {
        OK = 0,
        SOMETHING_IS_WRONG,
        SOMETHING_ELSE_IS_WRONG,
        ...
    };
};

typedef FuncErrorCodes::Type FuncErrorCode;

FuncErrorCode func() {
    // stuff
    if (something is wrong) {
        return FuncErrorCodes::SOMETHING_IS_WRONG;
    }
    // more stuff
    if (something else is wrong) {
        return FuncErrorCodes::SOMETHING_ELSE_IS_WRONG;
    }
    ...
    // all good
    return FuncErrorCodes::OK;
}

我认为没有理由要将__LINE__用于错误代码。

在通常情况下,返回代码仍然可以针对0进行测试(或者更好FuncErrorCodes::OK)并且我对测试特定错误的原因没有问题,例如:

FuncErrorCode rc = func();
EXPECT_EQ(FuncErrorCodes::SOMETHING_IS_WRONG, ret);

编辑:请注意,即使您设法将“最后一行设置为错误代码”,也无法以任何方式帮助您,因为这将是函数返回的确切值(所以你已经知道了)。为了实际工作,你需要每个可能的错误行的单独变量,然后它将包含特定的行号(这样可以根据函数返回码检查它是否有特定的错误)发生)。

即。你需要这样的东西:

extern int something_wrong_line_number;
extern int something_else_wrong_line_number;

if (something is wrong) {
    something_wrong_line_number = __LINE__; return __LINE__;
}

if (something else is wrong) {
    something_else_wrong_line_number = __LINE__; return __LINE__;
}

// etc. - but it will of course still not work entirely well because the __LINE__ is only assigned if the error actually happens

然后就像我建议的那样为每个特定的错误情况提供简单的错误代码没有什么不同(而且它要复杂得多)。