C语言函数声明的问题

  程序中定义了一个函数,定义成void无返回值,在主函数中调用该函数会报错,需要在主函数前声明该函数才能调用,但是如果将该函数设置为有返回值,则不需要提前声明就可以在主函数中调用,这是什么原因呢?
int main(void)
{
    switch_test();
    return 0;
}

int switch_test()
{
    printf("test");
    return 10;
}

这样可以调用,没问题

int main(void)
{
    switch_test();
    return 0;
}

void switch_test()
{
    printf("test");
}

把返回值设置为void,提示"错误 C2371 “switch_test”: 重定义;不同的基类型 "

main之前肯定还有函数申明啊,那里的返回值类型也要改成void

已经提示了重定义,说明void switch_test()这个函数在其他地方被定义了。
另外建议在调用函数前,还是需要先声明该函数