带有void参数列表的main函数和空参数列表的main函数有什么不同?

10

1
我建议阅读http://en.wikipedia.org/wiki/Void_type,其中包含有用的信息,例如这句话:“void类型也可以作为函数原型的唯一参数出现,以表示该函数不带参数。” - Grüse
1
你可以在这里找到答案:https://dev59.com/pXA65IYBdhLWcg3wogOe(这个问题是一个重复的问题) - user1284631
我完全不认为这是重复的。 - Evan Carroll
5个回答

13
在C语言中,一般而言,(void)表示函数调用时不需要参数,而()则表示参数数量未指定。
例如:
void foo(void)
{
   // body
}

void bar()
{
    //body
}

在调用环境中,

foo();  // Correct 
foo(1); // Incorrect
bar();  // Correct
bar(1); // Also correct

这是一般性的解释。

但对于您的情况,C99标准规定,

5.1.2.2.1 程序启动

程序启动时调用的函数名为main。实现不为此函数声明原型。它应定义为返回类型为int且无参数的形式: int main(void) { /* ... */ }

或者

带有两个参数(在本文中称为argc和argv,虽然可以使用任何名称,因为它们仅在声明它们的函数中有效): int main(int argc, char *argv[]) { /* ... */ } 或者其等效形式;

或者以其他某种实现定义的方式。

因此,在此 void main(void) 中,返回类型应该是 int

最后,对于 main(),没有给出返回类型,因此隐式返回类型为 int


那么 void bar()void bar(...) 是一样的吗? - anishsane
@JosephLee:是的,必须避免,参见我在答案中提到的标准。main()应该只有两种类型的定义,并且The implementation declares no prototype for this function - Omkant
1
此外,main函数返回的值将作为进程的退出状态返回给操作系统。因此,main函数必须返回一个值。 - anishsane
1
@anishsane 没有人提到这是托管的(操作系统)还是不托管的。另请参阅C11 5.1.2.2.3:到达终止main函数的}返回值为0.。因此,main()是一个特殊情况,不遵循其他函数的逻辑。 - Lundin
@anishsane 很可能是因为使用的编译器遵循了旧版本的标准C89。作为程序员,你有责任选择一个符合你打算编写程序的标准的编译器。如果你按照C99的规范编写代码,但在C89编译器上编译,那么这是由程序员引起的错误,而不是编译器的问题。 - Lundin
显示剩余6条评论

2

在主函数中排除返回类型,如下:

main(){
}

这并不意味着它是一个 void 类型,这取决于编译器。我认为可以说它通常被解释为

int main(){
}

void类型告诉编译器没有“实体”(没有“存储”),因此

void func(int i)

接受一个整数但不返回任何值。对于参数来说,它是这样的:

void func()

等同于这个:

void func(void)

这更明确地表明它不需要参数。但void *类型则不同,它是一种类型,指向一个无量纲的指针。


如果void func(int i)接受一个整数但不返回任何值,那么它有什么用处呢?看起来它什么也没做。 - Joseph Lee
不,这是非常普遍的,例如用于与硬件交互。 - lunadir
更有可能的是,void func() 会修改在文件作用域声明为静态的私有变量。 - Lundin
“并不意味着它是一个空类型,这取决于编译器”,如果是C90编译器,它将等同于int main()。如果是标准C编译器,则无法编译。 - Lundin

2
基本上,void是一种数据类型,在方法声明中通常会使用。它意味着什么也没有没有类型。例如:
1)int myFunc(void) -- 此函数不需要任何参数。
2)void myFunc(int) -- 此函数不返回任何值。
3)void* data; -- 'data' 是指向未知类型数据的指针,不能被解引用。

我开始理解你在解释1和2中所说的void是什么。谢谢。然而,我不明白什么是指针。什么是解引用? - Joseph Lee
@JosephLee 对不起我使用了指针。但是,我只是想向您展示在哪里以及如何使用void。如果您不了解指针,请忽略那部分。只需专注于这一部分,“void”表示“无类型”。 - Ravi
没有必要道歉。我想学习。如果你能再多说一些,那将不胜感激。如果不能,我会稍后提出更好的问题。 - Joseph Lee
正如你所说,你是初学者,所以最好一步一步地开始。指针有点难理解,所以最好先搞清楚基础知识。而且,在 StackOverFlow 中,我们总是欢迎学习者的到来。 :) - Ravi

1

Void的意思是“空虚”。在void main()的例子中,它意味着函数main()不返回任何值。我觉得有必要告诉你应该尽量避免使用void main()(无恶意),而是使用int main()。int main()确保您的程序可以在关闭时向操作系统返回int类型的值。Void还有许多其他用途,如果您想了解更多信息,请查看this website


我查看了网站,但是听说C和C++有很大的不同。我想更多地了解关于C中void的知识。 - Joseph Lee
对不起,我没有看标签。 - Kevin
@Kevin 应该避免在托管系统(运行在操作系统上的程序)中使用 void main(),因为它在这些系统上无法编译。 - Lundin

0

void 是一种没有值的数据类型。它也是一种无法完成的不完整数据类型。当用作函数的返回类型时,它表示该函数不返回任何值:

void foo(int x);

当作为参数列表使用时,它表示函数不接受任何参数:

void bar(void);

这与空参数列表不同,空参数列表表示函数接受一个 未指定 数量的参数(在 C 中;在 C++ 中,空参数列表等同于使用 void):

void bletch();

没有任何对象(变量)可以被定义为 void 类型。但是,你可以声明 void * 类型的指针:它们是“通用”的指针,可以在不需要显式转换的情况下转换为其他指针类型。标准的内存分配函数 malloccallocrealloc 都返回 void * 类型:

double *darr = malloc(sizeof *darr * rows);

在托管实现中(基本上,任何具有操作系统的东西),main 必须声明为:
int main(void)

或者

int main(int argc, char **argv) // the parameter names can be whatever you want,
                                // but argc and argv are the usual convention;
                                // char **argv is equivalent to char *argv[]

或以其他某种实现方式;实现可能接受

void main()

作为main的合法签名,但必须明确地在某个地方记录下来

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接