【问题标题】:Definition of main() in C [duplicate]C中main()的定义
【发布时间】:2012-08-28 01:50:42
【问题描述】:

可能重复:
Standard way to define parameter-less function main() in C

我能否在 C 中使用函数main()声明定义,如下所示:

int main() {}

是的,我看到标准说只有两个保证支持的版本:

int main(void) {}

int main(int argc, char* argv[]) {}

但是空括号呢?我知道它与 C++ 中的含义不同(在 C 中,这意味着该函数的参数的数量和类型是未知的),但是我在 C 中看到了很多带有此 declaration 定义的代码主要的。

那么谁错了?

【问题讨论】:

  • 简短的回答是“您可能会侥幸逃脱,因为您的编译器可能处于相当宽松的设置,但同时您可能不应该尝试,因为它有点错误,会损坏可移植性稍差,可能会引发编译器警告,并没有给您带来任何好处。”

标签: c


【解决方案1】:

在 C 中,声明 int main();int main(void); 之间存在区别(前者声明一个具有未指定个参数的函数,而后者是实际上称为原型)。但是,在函数定义中,main()main(void) 都定义了一个接受 no 参数的函数。

另一个签名main(int, char**) 是一个替代形式。符合要求的实现必须接受任何一种形式,但也可以接受main() 的其他实现定义的签名。任何给定的程序当然可能只包含 一个 称为 main 的单个函数。

【讨论】:

  • 想提及 C99 标准中的第 J.5 节通用扩展? §J.5.1 环境参数 / ¶1 在托管环境中,主函数接收第三个参数char *envp[],它指向一个以空结尾的指向 char 的指针数组,每个指针指向一个字符串提供有关程序执行环境的信息 (5.1.2.2.1)。
  • 您的第一句话不是真的:main() 接受未知数量的参数;只有main(void) 没有参数
  • 值得注意的是,虽然int main() {...} 作为定义确实定义了一个没有参数的函数,但它本身并没有引入main 的原型。 IE。在这样的定义之后,main 仍然声明为具有未指定参数的函数。 “无参数”位仅影响 main 的正文。
  • 您的意思是,在 C 语言中,空括号的放置位置有所不同 - 在函数声明或函数定义中?带有空 () 的函数声明 - 具有未指定数量和类型的参数的函数,带有空 () 的函数定义 - 函数不接受任何参数。正确的?如果可以的话,您能否发布标准的报价?
  • @NikitaTrophimov:链接的“可能重复”主题提供了标准参考。
【解决方案2】:

int main() 和任何其他类似的函数声明,它接受未知数量的参数,所以这对于主函数是绝对错误的。 int main(void) 不需要参数。

char* argv[]argument vector。当你在命令行上写你的参数时,你会在这个字符串向量中找到参数。有时您也可以找到char **argv,但它是一样的。括号[] 是空的,因为我们不知道有多少参数来自用户; int argc argument count 存在于此目的:它计算argv 中有多少参数(尽管列表以argv[argc] == NULL 作为标记终止值)。

另请阅读link,了解通用foo()foo(void) 之间的区别

【讨论】:

  • 作为声明,int main() 是有问题的;在函数定义中(也提供了主体),它说函数不接受参数,但不提供函数的原型声明,所以如果你递归调用main(),你不会被阻止错误的调用。这通常不是主要问题!
  • 这对于 main 函数是绝对错误的,如果你在程序的某处显式调用 main,这可能比 int main(){} 更应该避免
【解决方案3】:

如果实现将int main()(不带参数)明确记录为有效签名,那么从 C99 开始,一切都很好(§5.1.2.2.1 ¶1,“...或以其他实现定义的方式。 ”)。

如果实现没有记录它,那么严格来说行为是未定义的(§4 ¶2),但它导致行为与int main(void) 显着不同的可能性是,在我的经验,太低了。

【讨论】:

    【解决方案4】:
       int main() {}
       this is the standard prior to the c99 standard of main method.
    
       int main(void){}
       this is the standard coined by ANSI.
    
       int main(int argc, char* argv[]) {}     
       This is the another version of main which provides the user to pass the command line
       argument to the main method.
    

    【讨论】:

    • int main(void) 至少比您所说的大 10 年。
    • 我没有用谷歌搜索,但不知何故我读到了它
    猜你喜欢
    • 2014-12-15
    • 2011-12-18
    • 1970-01-01
    • 2023-03-08
    • 2018-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多