【问题标题】:Is this a valid definition for main()这是 main() 的有效定义吗
【发布时间】:2015-09-09 03:19:13
【问题描述】:

C11 标准声明:

5.1.2.2.1 程序启动

  1. 程序启动时调用的函数名为main。实现没有声明这个函数的原型。它应使用int 的返回类型定义并且不带参数:

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

    或带有两个参数(此处称为argcargv,尽管可以使用任何名称,因为它们是声明它们的函数的本地名称):

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

    或等价物; 10),或以其他一些实现定义的方式。


10) 因此,int 可以替换为定义为inttypedef 名称,或者argv 的类型可以写为char ** argv,等等。

我们将忽略这部分:或以其他实现定义的方式。因为我只对与上述两个示例等效的定义感兴趣。

这是否是 main 的有效定义,因为 char* a[4]char** 是等价的:

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

VLA 数组怎么样,我们假设printf 将返回一个正整数值:

int main(int argc, char* argv[printf("Hello there!")]){/*...*/}

【问题讨论】:

  • 请注意,您引用的是托管实现部分。本节不包括独立的实现。
  • 我想问一下argv[static 4]是否也等同于这些会很有趣。
  • @GrzegorzSzpetkowski:是的,因为static 不会影响类型。当然,像constrestrict 这样也可以这样使用的类型限定符会影响它。

标签: c standards language-lawyer c11


【解决方案1】:

是的,这都包含在“或等价物”中。关于重命名参数或使用typedefed 类型的脚注只是示例。

我最喜欢的变种是

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

因为它拥有关于所有main 函数语义的最多信息。

【讨论】:

    【解决方案2】:
    int main(int argc, char* argv[4]){/*...*/}  
    

    main 的有效签名。编译器将忽略char argv[4] 中的4,它等效于char argv[] = char **argv。第二个签名也是如此。

    【讨论】:

    • 鉴于在 C11 中执行 typedef int FOO[printf("Wow");]; 将执行 printf,即使没有变量被声明为 FOO 类型,标准中是否有任何内容指定不计算数组参数的维度,而不是被评估并忽略结果?
    • @supercat;没有发现任何反对意见。
    • 你的意思是标准似乎允许这样的执行,但没有具体说明它会发生吗?它是否说明了void foo(int x[-1])length <= 0 时调用void foo(int length; int dat[length]) 的有效性?当xy是全局变量时,void foo(int dat[x++][y++])的效果如何?
    • 是否说明了 void foo(int x[-1]) 的有效性:是的。你会得到这个编译错误。实际发生的是,在编译时编译器将检查[ 之后是否有 +ve 数字/值。如果有一个 +ve 数字(或表达式的值)或什么都没有,那么它很好,否则它会引发错误。 void foo(int length; int dat[length])void foo(int dat[x++][y++]) 在 C99 及更高版本中完全有效。阅读 C11:第 6.7.6.2 节 p4 和示例 10。
    • 根据我对标准的阅读,将函数定义为void foo(int dat[x++][y++]) {...} 将要求如果y 在调用foo 之前大于零,则编译器必须递增它(如果@987654339 @ 不大于零,调用是 UB),但编译器不要求增加 x 也不对其值提出任何要求?这与你的阅读相符吗?
    猜你喜欢
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 2011-03-07
    • 2011-04-15
    • 2020-03-12
    相关资源
    最近更新 更多