编译器的差异。 C语言

时间:2017-01-15 10:06:50

标签: c visual-studio

为什么我的" C"代码不能在Linux(编译器ggdb3,C99)中编译,但在Visual Studio中工作得很好? 这里有错误消息:

  

20:1:错误:控制可能会达到非空函数的结束   [-Werror,-Wreturn型]       }

#include <stdio.h>
//  Function to determine if one character string exists inside another string.
int findString(char source[], char searching[])
{
    int i = 0, j = 0;

    for (; source[i] != '\0'; i++) {
        if (source[i] == searching[j])
            if (source[i + 1] == searching[j + 1] &&
                source[i + 2] == searching[j + 2])
                return i;
            else
                return -1;
    }

}

int main(void)
{
    int index = findString("a chatterbox", "hat");

    if (index == -1)
        printf("No match are founded\n");
    else
        printf("Match are founded starting index is %i\n", index);

    return 0;
}

我试图在这个功能中编辑,但它没有帮助

if (source[0] == '\0')
        return -1;

2 个答案:

答案 0 :(得分:2)

看起来您实际上只是在收到警告,但是由于您已经为Linux编译器提供了命令行参数-Werror,因此它将警告视为错误。如果查看Visual Studio的编译器输出,您应该会看到类似的警告。

答案 1 :(得分:1)

第一个C不是Python,因此您需要正确使用括号(而不仅仅是缩进)。

那就是说,问题在于你的findString()功能。如果你正确地放置了一些括号,那么if (source[i] != searching[j])该函数没有return语句 - 而它预计会返回int

 if (source[i] == searching[j])
 {
     ...
 }
 // what if source[i] != searching[j]
 // you do not have any return statement for a function returning int

无法从非void函数返回会导致未定义的行为。

引用C11(由rubenvb撰写)

  

6.9.1函数定义

     

12如果到达了终止函数的},并且调用者使用了函数调用的值,则行为是未定义的。

它是more clear与C ++:

  

[...]离开函数末尾相当于没有值的返回;这导致值返回函数中的未定义行为。[...]