【问题标题】:Is main with parameter list of void different from main with an empty parameter list? [duplicate]带有 void 参数列表的 main 与带有空参数列表的 main 是否不同? [复制]
【发布时间】:2012-12-02 08:20:35
【问题描述】:

可能重复:
Why is the type of the main function in C and c++ left to the user to define?

什么是 void ?有人提供一些例子,正确使用 void 吗?而我们写void main (void)main()有什么区别?

【问题讨论】:

  • 我建议阅读en.wikipedia.org/wiki/Void_type 它包含有用的信息,例如这句话:“void 类型也可能作为函数原型的唯一参数出现表示该函数不带参数。”
  • 你可以在这里找到你的答案:stackoverflow.com/q/3711048/1284631(这个问题是重复的)
  • 我根本不认为这是重复的。

标签: c main void


【解决方案1】:

在 C 中,一般来说,(void) 表示函数调用中不需要参数,而() 表示未指定数量的参数。

例如

void foo(void)
{
   // body
}

void bar()
{
    //body
}

在调用环境中,

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

这是一般解释。

但是对于 main() 的情况,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 :不,这称为可变数量的参数,要实现这个bar(...),至少需要一个参数,这是第一个参数,然后只需要...,所以正确的方法是bar(char *,...)
  • 我在这个网站上阅读了很多关于空洞的 cmets 和问题。我认为“void main(void)”不会返回任何值。有人说应该不惜一切代价避免它。
  • 另外,main返回的值作为进程的退出状态返回给操作系统。因此 main 必须返回一个值。
  • @anishsane 没有人提到这是否是托管(OS)。另请参阅 C11 5.1.2.2.3:reaching the } that terminates the main function returns a value of 0.。所以 main() 是一个特例,不遵循其他函数的逻辑。
【解决方案2】:

排除main中的返回类型

main(){
}

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

int main(){
}

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

void func(int i)

接受一个 int 但不返回任何内容。在参数的情况下:

void func()

等价于:

void func(void)

更明确地表明它不带参数。 不同的故事是 void * 类型,它一个类型,一个指向无量纲的指针。

【讨论】:

  • ???如果 void func(int i) 接受一个整数但什么都不返回,那有什么用呢?它似乎什么也没做。
  • 不,这很常见,例如与硬件交互
  • 或者更有可能的是,void func() 改变了在文件范围内声明为静态的私有变量。
  • “不代表是void类型,要看编译器”,是的,如果是C90编译器,就相当于int main()。如果是标准的C编译器,是不会编译的。
【解决方案3】:

基本上,void 是一种数据类型,基本上与方法声明一起使用。它的意思是nothingno type。例如:

1) int myFunc(void) -- 该函数不接受任何内容。

2) void myFunc(int) -- 函数不返回任何内容

3) void* data; -- 'data' 是一个指向未知类型数据的指针,不能被取消引用

【讨论】:

  • 我开始明白您的解释 1 和 2 中的空白是什么。谢谢。但是,我不明白什么是指针。取消引用是什么意思?
  • @JosephLee 很抱歉使用指针。但是,我只是想告诉你,我们可以在哪里以及如何使用 void。如果您不了解指针,请离开该部分。只集中这部分,void表示no type
  • 没有理由道歉。我想学习。如果您能进一步说什么,将不胜感激。如果没有,我稍后会提出更好的问题。
  • 如你所说,你是初学者,所以最好一步一步开始。指针有点难理解,所以最好先弄清楚你的基础。而且,StackOverFlow 总是欢迎学习者。 :)
【解决方案4】:

Void 的意思是“空虚”。在您的 void main() 示例中,这意味着函数 main() 不返回值。我觉得有义务告诉你应该不惜一切代价避免使用 void main() (不是双关语),而是使用 int main() 。 int main() 确保您的程序可以在关闭时向操作系统返回一个 int 类型的值。 void 还有许多其他用途,如果您想了解更多信息,请查看this website

【讨论】:

  • 我查看了网站,但我听说 C 和 C++ 有很大的不同。我想了解更多关于 C 方面的空洞。
  • 对不起,我没看标签,抱歉:)
  • 没问题。还是谢谢。
  • @Kevin void main() 应避免在托管系统(在操作系统上运行的程序)上使用,因为它不会在此类系统上编译。
【解决方案5】:

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 的合法签名,但它必须在某处明确记录这一点

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-06
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    • 2018-03-16
    相关资源
    最近更新 更多