chq*_*lie 18 c language-lawyer function-prototypes c23
C23 在函数声明符中引入了新的语义:
\n\n\n6.7.6.3 函数声明符
\n[...]
\n13\xc2\xa0\xc2\xa0\xc2\xa0对于没有参数类型列表的函数声明符:效果就像是使用由关键字 组成的参数类型列表进行声明
\nvoid
。函数声明符提供函数的原型。
这似乎意味着具有空参数列表的函数定义可以等效地用()
or编写(void)
。
然而,该函数似乎并不能保证这种main
等价性:
\n\n5.1.2.2.1 程序启动
\n程序启动时调用的函数名为
\nmain
。该实现没有声明该函数的原型。它的返回类型应为int
且不带参数定义:Run Code Online (Sandbox Code Playgroud)\nint main(void) { /* ... */ }\n
或带有两个参数(此处称为
\nargc
和argv
,但可以使用任何名称,因为它们对于声明它们的函数来说是本地的):Run Code Online (Sandbox Code Playgroud)\nint main(int argc, char *argv[]) { /* ... */ }\n
或等效的或以某种其他实现定义的方式。
\n
这似乎并不能保证 是 的int main() { /* ... */ }
有效定义main
,或者等效定义是否涵盖此变体?
令我困扰的是,C17 中使用该语法int main()
(6.5.3.4 和 6.7.6.3 中)的 2 个示例已更改为int main(void)
在最新的 C23 草案中使用。
Jon*_*ler 20
在 C17 及早期版本的标准中,int main() { \xe2\x80\xa6 }
未提供原型main()
,但在其他方面等效于int main(void) { \xe2\x80\xa6 }
。
在 C23 中,int main() { \xe2\x80\xa6 }
确实提供了 的原型,main()
并且除了拼写之外,与 完全等效int main(void) { \xe2\x80\xa6 }
。
main()
仅当您递归调用 C 中允许而 C++ 中不允许的 \xe2\x80\x94 内容时,差异才有意义。在 C17 或更早版本中int main()
,允许像这样的递归调用main(23, "elephants");
,因为没有指定 的原型main()
(假设 的定义main()
在递归调用之前是可见的)。和int main(void)
,这是不允许的,因为作用域中有一个原型表示“无参数”。
请注意C 和 C++ 中应该返回什么main()
?中的内容。 这引起了广泛的讨论,包括 C17 和早期标准在其(非规范)示例中同时使用int main()
和。int main(void)
它还指出了微软为Windows系统指定的内容以及附件J“通用扩展”提到的内容(两者都认可int main(int argc, char **argv, char **envp)
)。main()
Apple 甚至还有\xe2\x80\x94的第四个可选参数int main(int argc, char **argv, char **envp, char **apple)
,其行为类似于argv
或envp
。我需要尽快更新我对 C23 的答案。
归档时间: |
|
查看次数: |
2789 次 |
最近记录: |