【问题标题】:Visual C++ saying void function needs to return a valueVisual C++ 说 void 函数需要返回一个值
【发布时间】:2010-12-14 21:43:59
【问题描述】:

Visual C++ 说我的 void 函数需要返回值

我在我的 mac 上编译了它,它运行良好,但现在我正在尝试用 Visual c++ 编译它(使用 windows 7)

这是构建日志:

命令行创建临时文件 "c:\Users\Jonathan\Documents\Visual 工作室 2008\项目\magicsquare\调试\RSP00000822923000.rsp" 内容为 [ /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /Gm /EHsc /RTC1 /MDd /Fo"调试\" /Fd"调试\vc90.pdb" /W3 /c /ZI /TP ".\magicsquare.cpp" ] 创建命令行“cl.exe @"c:\Users\Jonathan\Documents\Visual 工作室 2008\项目\magicsquare\调试\RSP00000822923000.rsp" /nologo /errorReport:prompt"

输出窗口正在编译... 魔方.cpp c:\users\jonathan\documents\visual 工作室 2008\项目\magicsquare\magicsquare.cpp(224) : 错误 C4716: 'check' : 必须返回一个 价值

结果构建日志保存在 "file://c:\Users\Jonathan\Documents\Visual 工作室 2008\Projects\magicsquare\Debug\BuildLog.htm" magicsquare - 1 个错误,0 个警告

我的函数头和函数

void **check (int **, int);

void **check(int **matrix, int size)
{   
    //check if first row and last row are the same
    int rsum = 0, rsum2 = 0;
    bool rowflag = false;
    for(int i = 0; i < size; i++)
    {
        rsum += *(*(matrix + 0) +i);
        rsum2 += *(*(matrix + size - 1) +i);
    }

    //check if first column and last column are the same    
    int csum = 0, csum2= 0;
    bool columnflag = false;
    for(int i = 0; i < size; i++)
    {
            csum += *(*(matrix + i) + 0);
            csum2 += *(*(matrix + i) + size - 1);
    }   

    //check if diagonals are the same
    int diagonal = 0, diagonal2 = 0;
    bool diagonalflag = false;
    for(int i = 0; i < size; i++)
        diagonal += *(*(matrix + i) + i);

    int m = 0;
    int n = size - 1;   
    while (m <= size - 1)
    {
        diagonal2 += *(*(matrix + m) + n);
        m++;
        n--;
    }

    //if row, column, diagonal are the same
    if (rsum == rsum2 && rsum2 == csum && csum == csum2 && csum2 == diagonal && diagonal == diagonal2)
        cout << "This is a Magic Square\n" << endl;
    else 
        cout << "This is not a Magic Square\n" << endl;
}

如果需要,这里是整个代码 http://pastie.org/691402

【问题讨论】:

    标签: c++ function void


    【解决方案1】:

    您的函数返回一个 (void **),它是一个指向 void 指针的指针。要创建一个 void 函数,只需将其声明为:

    void check(int** matrix, int size);
    

    您的原始代码将在 C 中编译,但在 C++ 中不会出现警告。在 Visual Studio 2008 中尝试此操作。将文件扩展名重命名为 .c 而不是 .cpp 以强制 C 编译而不是 C++ 编译。它将编译并发出警告。但要注意,如果你曾经使用过 check 的返回值,那就是垃圾。

    此链接有更多详细信息: http://pdhut.50megs.com/vczone/articles/diffc/diffc.htm

    【讨论】:

    • 这是另一个问题:“我有一个函数应该返回一个 ptr。它没有,我的编译器也没有抱怨。为什么?”
    • @Raptrex:C 和 C++ 编译器都不需要检测丢失的 return 语句。缺少返回不是 C/C++ 中的错误。 (顺便说一句,上面的答案声称它不会在 C++ 中编译是不正确的)。这意味着这是一个实施质量问题。一些编译器会加倍努力来检测丢失的返回,而有些则不会。你的 Mac 编译器显然是一个懒惰的品种,所以它没有检测到它。此外,您的 Mac 编译器可能有一个开关强制它检测此类问题,您只是忘记打开它。
    【解决方案2】:

    取出退货时的**。即签名应该是:

    void check(int **matrix, int size);
    

    查看您的 paste.org 代码示例,我猜您复制并粘贴了其他函数,但忘记删除 **。

    【讨论】:

      【解决方案3】:

      就像其他人指出的那样,您的返回类型不正确。您没有在函数中返回任何内容,因此只需删除 ** 就可以了。

      出于好奇,您在 Mac 上编译时是否收到任何警告? g++(在我的 Linux 机器上)只使用 -Wall 给出警告。

      【讨论】:

      • 查看我对另一个答案的注释:MacOS X 10.5.8 上的 G++ 4.0.1 仅给出带有“-Wall”的警告。
      • @Jonathan Leffler:我在 Linux (g++ 4.3.4) 上注意到的相同
      【解决方案4】:

      那个函数不是无效的,是无效的**。这意味着它必须返回一个指向 void 指针的指针。

      【讨论】:

        【解决方案5】:

        这不是void 函数,而是void ** 函数。这意味着您需要返回指向 void 指针的指针。

        【讨论】:

          猜你喜欢
          • 2016-08-28
          • 2021-04-02
          • 1970-01-01
          • 2017-07-13
          • 2014-01-16
          • 1970-01-01
          • 2023-01-28
          • 1970-01-01
          • 2017-08-09
          相关资源
          最近更新 更多