C++函数"自动"返回值?

C++ Function "Automatic" Return Value?

本文关键字:返回值 自动 C++ 函数      更新时间:2023-10-16

这是如何工作的?在编写此函数时,我忘了包含一个return语句:

char *getV(const char *var) {
    char *val = nullptr;
    forward_list<formField>::iterator idx;
    formField ffld;
    idx = _fields.begin();
    while (idx != _fields.end()) {
        ffld = *idx;
        if (strcmp(ffld.Name, var) == 0) {
            val = ffld.Val;
            break;
        }
        idx++;
    }
}

这是formField

struct formField {
    char    *Name   = nullptr;
    char    *Val    = nullptr;
};

以下是我调用该函数的方式:

int main () {
    form fdata;
    fdata.add("FirstName", "Alan");
    char *fval = fdata.getV("FirstName");
    if (fval != nullptr) cout << fval;
    else cout << "not found";
    cout << "n";
}

直到后来,在测试函数并编写使用它的其他代码之后,我才注意到缺少return。该函数应该返回*val...确实如此!如何?

平台的调用约定指定函数如何返回它想要返回给调用方的值(例如:保存在寄存器中(。由于寄存器存在,调用方代码只是获取它在那里找到的值,可能是垃圾,或者偶然获取实际的好值。无论哪种方式,您的程序都会调用未定义的行为,它不再被信任。

解决方案是打开编译器警告。例如,在 GCC 或 Clang 上:

g++ -Wall -Wextra -Werror

根据 [stmt.return](强调我的(:

从构造函数、析构函数或具有 cv void返回类型的函数的末尾流出等效于没有操作数的return。 否则,从 main 以外的函数末尾流出会导致未定义的行为

通常,您可以通过打开和读取编译器生成的警告(例如,将-Wall -Wextra与GCC或Clang一起使用(来捕获这些类型的错误。