【问题标题】:"int main (vooid)"? How does that work?“int main(无效)”?这是如何运作的?
【发布时间】:2011-06-26 14:57:04
【问题描述】:

我最近不得不输入一个小型 C 测试程序,在此过程中,我在 main 函数中犯了一个拼写错误,不小心使用了 vooid 而不是 void

但它仍然有效。

将其缩减为最小的完整版本,我最终得到:

int main (vooid) {
    return 42;
}

确实编译 (gcc -Wall -o myprog myprog.c) 并且在运行时返回 42。

这个有效代码到底是多少?


这是从我的bash shell 剪切和粘贴的成绩单,以显示我在做什么:

pax$ cat qq.c
int main (vooid) {
    return 42;
}

pax$ rm qq ; gcc -Wall -o qq qq.c ; ./qq

pax$ echo $?
42

【问题讨论】:

  • 通过使用单个 int 参数定义 main,您可以调用 Undefined Behaviour。任何事情都有可能发生:)
  • 实际上,我不确定 UB,@pmg。 ISO 特别允许标准两个规范的main 的其他可能性。为了便携性,您应该使用这两者之一,但我认为 UB 不适用于此处。
  • 嗯:在托管环境中 main 必须具有两种规范形式 (2.1.2.2) 之一。但你说得对@pax,在独立环境中,标识符main 一点也不特别:如果用作函数,它可以是任何类型,并且可以具有任意数量的任何类型的参数。
  • 在 C99 中,独立是完全由实现定义的。对于托管,第 5.1.2.2.1 节最后声明“或以其他实现定义的方式”,因此它至少需要两种规范形式,但也可以有其他形式(这将允许 UNIXy int main (int argc, char *argv[], char *envp[]);符合)。

标签: c syntax main


【解决方案1】:

它只是使用“旧式”函数声明语法;您隐式声明了一个名为 vooidint 参数。

【讨论】:

  • 好像是这样。如果添加“vooid=42; return vooid;”到 main,你也会得到一个 42 的返回值。
  • Aargghh,你是对的。如果我添加-std=c99,我会得到qq.c:1: warning: type of 'vooid' defaults to 'int'
【解决方案2】:

这是有效的代码,因为 myprog.c 包含:

int main (vooid) // vooid is of type int, allowed, and an alias for argc
{     
  return 42; // The answer to the Ultimate Question
} 

vooid 包含一加传递的参数数量(即argc)。所以,实际上你所做的只是将argc 重命名为vooid

【讨论】:

  • 如果你做了“return void;”相反,它确实给出了 1 + num。 args。
  • @Jeff,程序名算作争论,所以+1
【解决方案3】:

只有gcc -std=c89 -Wall -o qq qq.cgcc -std=gnu89 -Wall -o qq qq.c 不会发出警告。所有其他标准都会发出有关 vooid 的隐式类型 int 的警告。

int main(chart) 的行为方式与 int main (vooid) 相同。

return vooid; 返回命令行参数的数量。

我在 Debian 测试系统上使用 gcc 4.4.5 进行了测试。

【讨论】:

    【解决方案4】:

    在 C 中,函数参数的默认类型是 int。因此,您的程序将单词vooid 视为int main(int vooid),这是完全有效的代码。

    【讨论】:

      猜你喜欢
      • 2013-09-26
      • 2012-11-16
      • 1970-01-01
      • 2015-09-09
      • 2010-11-30
      • 2023-03-12
      • 1970-01-01
      • 2019-08-07
      • 2016-01-05
      相关资源
      最近更新 更多