C++函数"自动"返回值?
C++ Function "Automatic" Return Value?
这是如何工作的?在编写此函数时,我忘了包含一个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一起使用(来捕获这些类型的错误。
相关文章:
- 从python中调用C++函数并获取返回值
- 为什么模板类中的对象不能返回值
- 返回值优化:显式移动还是隐式
- lock_guard是否保护返回值
- 调用CreateProcess()并获取字符串的返回值
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 查找 GCD:并非所有控制路径都返回值
- 在 Arduino 上使用 sscanf 会导致与 const char * 不匹配,并且返回值始终相同,尽管输入值不同
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 如何从 std::thread 返回值
- 将返回值从 exe 传递到 bat,并将其传递给 C# 中的进程
- 编写一个函数,该函数将通过判断其每个参数的类型来自动确定其返回值
- 函数返回值的自动类型扣除
- C++函数"自动"返回值?
- 带有 if 语句的自动函数不会返回值
- 返回值的初始化应忽略自动对象的恒常性
- 在自动销毁变量之前或之后创建的c++返回值
- 自动与自动&&函数返回值
- 模板化(或以某种方式自动)方法的返回值