相关疑难解决方法(0)

为什么这个C++片段编译(非void函数不返回值)

今天早上我在我的一个图书馆找到了这个:

static tvec4 Min(const tvec4& a, const tvec4& b, tvec4& out)
{
    tvec3::Min(a,b,out);
    out.w = min(a.w,b.w);
}
Run Code Online (Sandbox Code Playgroud)

我期望编译器错误,因为此方法不返回任何内容,并且返回类型不返回void.

想到的唯一两件事是

  • 在调用此方法的唯一位置,不使用或存储返回值.(此方法应该是void- tvec4返回类型是复制和粘贴错误)

  • tvec4正在创建一个默认构造,这看起来有点不同,哦,C++中的其他所有东西.

我还没有找到解决这个问题的C++规范部分.参考文献(ha)表示赞赏.

更新

某些情况下,这会在VS2012中生成错误.我没有缩小具体细节,但它仍然很有趣.

c++ methods c++11 visual-studio-2012

128
推荐指数
5
解决办法
1万
查看次数

具有缺失返回值的函数,运行时的行为

正如所料,编译器(VisualStudio 2008)将发出警告

警告C4715:'doSomethingWith':并非所有控制路径都返回一个值

编译以下代码时:

int doSomethingWith(int value)
{
    int returnValue = 3;
    bool condition = false;

    if(condition)
        // returnValue += value; // DOH

    return returnValue;
}

int main(int argc, char* argv[])
{
    int foo = 10;
    int result = doSomethingWith(foo);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但程序运行得很好.函数doSomethingWith()的返回值为0.

是仅仅是未定义的行为,还是存在一定的规则如何在运行时创建/计算结果值.非POD数据类型作为返回值会发生什么?

c++

12
推荐指数
2
解决办法
3112
查看次数

C和C++函数没有return语句

在查看工作代码时,我发现了一些(看似)令人反感的代码,其中函数具有返回类型,但没有返回.我知道代码有效,但认为它只是编译器中的一个错误.

我编写了以下测试并使用我的编译器运行它(gcc(Homebrew gcc 5.2.0)5.2.0)

#include <stdio.h>

int f(int a, int b) {
  int c = a + b;
}

int main() {
   int x = 5, y = 6;

   printf("f(%d,%d) is %d\n", x, y, f(x,y)); // f(5,6) is 11

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

类似于我在工作中发现的代码,这默认返回函数中执行的最后一个表达式的结果.

我发现了这个问题,但对答案不满意.我知道-Wall -Werror可以避免这种行为,但为什么它是一个选项呢?为什么这仍然允许?

c c++ return

9
推荐指数
2
解决办法
9820
查看次数

为什么C标准允许您不从函数返回值?

我已经在gcc中成功编译并执行了以下代码:

#include <stdio.h>

int foo()
{

}

int main()
{
    int i = 12345;
    i = foo();
    printf("i is: %d", i);
}
Run Code Online (Sandbox Code Playgroud)

输出是:

i is: 0
Run Code Online (Sandbox Code Playgroud)

所以gcc允许我不从函数返回foo()foo()返回0.

这种行为只适用于gcc还是其他C标准也有它(基于我的理解,gcc不符合任何C标准)?

c gcc

5
推荐指数
3
解决办法
359
查看次数

标签 统计

c++ ×3

c ×2

c++11 ×1

gcc ×1

methods ×1

return ×1

visual-studio-2012 ×1