主函数的兼容类型

问题描述 投票:0回答:1

来自 ISO/IEC 9899:2024, 5.1.2.3.2, 程序启动:

程序启动时调用的函数名为

main
。这 实现没有声明此函数的原型。应该是 定义返回类型为
int
并且不带参数:

int main(void) { /* ... */ } 

或带有两个参数(此处称为

argc
argv
,尽管可以使用任何名称,因为它们是本地的 声明它们的函数):

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

或等价物;6) 或以其他某种实现定义的方式。

页面末尾的脚注说:

  1. 因此,
    int
    可以用定义为
    int
    的typedef名称替换,或者
    argv
    的类型可以写成
    char ** argv
    ,或者 返回类型可以通过
    typeof(1)
    指定,依此类推。

由此,我得出结论,

main()
的原型可以是以下任何一个:

1. int main(void) { /* ... */ }

/* Because function declarations whose parameter list is empty is treated the same 
   as a parameter list that contains only a single void in C23. */
2. int main() { /* ... */ }       

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

4. int main(int argc, char **argv) { /* ... */ }

/* Or any other value than 1 that fits in the range of an int. */
5. typeof(1) main() { /* ... */ }  /* And all the other aforementioned variants as well. */

6. typedef int val;
   val main(val argc, char **argv) { /* ... */ } /* And all the other aforementioned variants as well. */

还有其他类型等价吗?来自 https://codereview.stackexchange.com 的@Davislor 说:

第 6.7.6.3 节指出,在函数声明中,

*argv[]
const **argv
是“兼容类型”。

所以第七个变体可以是:

7. int main(int argc, char const **argv) { /* ... */ }

那么呢:

int main(const int argc, char const **argv) { /* ... */ }

还有其他兼容类型,如果还有的话?

c language-lawyer program-entry-point
1个回答
0
投票
  • 第七点矛盾

参数

argc
argv
以及
argv
指向的字符串 数组应可由程序修改,并保留其最后存储的 程序启动和程序终止之间的值。

IMO 它阻止了这种形式的

main
功能

© www.soinside.com 2019 - 2024. All rights reserved.